Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MS SQL";“关于删除级联”;多个外键指向同一个表?_Sql_Sql Server_Foreign Keys_Constraints_Cascading Deletes - Fatal编程技术网

MS SQL";“关于删除级联”;多个外键指向同一个表?

MS SQL";“关于删除级联”;多个外键指向同一个表?,sql,sql-server,foreign-keys,constraints,cascading-deletes,Sql,Sql Server,Foreign Keys,Constraints,Cascading Deletes,我有一个问题,我需要对指向同一个表的多个外键进行级联 [Insights] | ID | Title | | 1 | Monty Python | | 2 | Spamalot | [BroaderInsights_Insights] | broaderinsight_id | insight_id | | 1 | 2 | 基本上,当insights表中的一条或两条记录被删除时,我需要同时删除该关系 我试过这个:

我有一个问题,我需要对指向同一个表的多个外键进行级联

[Insights]
| ID | Title        |
| 1  | Monty Python |
| 2  | Spamalot     | 

[BroaderInsights_Insights]
| broaderinsight_id | insight_id |
| 1                 | 2          |
基本上,当insights表中的一条或两条记录被删除时,我需要同时删除该关系

我试过这个:

 CREATE TABLE broader_insights_insights(id INT NOT NULL IDENTITY(1,1),
   broader_insight_id INT NOT NULL REFERENCES insights(id) ON DELETE CASCADE,
   insight_id INT NOT NULL REFERENCES insights(id) ON DELETE CASCADE,
   PRIMARY KEY(id))
Go
这会导致警告,即级联“可能导致循环或 “多重级联路径”

因此,我尝试将级联添加到insight_id中,结果是:

DELETE语句与引用约束冲突

有什么想法吗

谢谢


Daniel

您必须将此作为insights上的一个而非删除触发器来实现,以使其正常工作。比如:

create trigger T_Insights_D
on Insights
instead of delete
as
    set nocount on
    delete from broader_insights_insights
    where insight_id in (select ID from deleted) or
    broader_insight_id in (select ID from deleted)

    delete from Insights where ID in (select ID from deleted)


通常,对于级联删除和大量外键,您需要花时间确定“级联”顺序,以便将发生在“树”顶部的删除成功级联到引用表。但在这种情况下,这是不可能的。

这样的级联删除很少是个好主意。想一想如果你还有“布莱恩的生活”会发生什么。Delete LoB和Delete级联以杀死Monty Python,后者级联以删除Spamalot。因为这是一种循环关系,删除循环中的任何成员都会删除整个循环。我是不是误解了级联?我以为这个概念是当引用的记录被删除时,关系也被删除了?您建议如何实现这一点?您需要在一个事务(最简单的存储过程)中进行删除,而不是通过级联删除。@Marc B-级联只在一个方向上工作。删除LoB将删除此链接表中对LoB的任何引用,但不会影响Insights中的任何其他行。对多个级联路径的需求是普遍存在的,也是完全合理的。实际上,任何时候你有一个多对多的关系,你需要它。假设您有零件、供应商和零件供应商。如果删除零件,则要删除该零件的零件供应商中的所有行。如果删除供应商,则要删除该供应商的PartVendors中的所有行。但是SQLServer不支持这一点。这太烦人了,没有其他严重的DB引擎有这个问题,人们在2005年抱怨过,Microsfot在2008年同意这是一个“令人满意的功能”,但在2014年他们仍然没有。