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年他们仍然没有。