MS SQL“ON DELETE CASCADE”指向同一个表的多个外键?

问题描述:

你好, 我有一个问题,我需要在指向同一个表的多个外键的级联..MS SQL“ON DELETE CASCADE”指向同一个表的多个外键?

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

[BroaderInsights_Insights] 
| broaderinsight_id | insight_id | 
| 1     | 2   | 

基本上当任一记录表被删除,我需要关系的见解一个或两个也可删掉..

我已经试过这样:

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语句冲突与基准约束”

任何想法?

感谢

丹尼尔

+1

这样的级联删除很少是一个好主意。想想如果你在那里还有“布莱恩的生活”会发生什么。删除LoB,删除级联以杀死Monty Python,级联删除Spamalot。由于它是循环关系,因此删除该圆的任何成员都会删除整个圆。 – 2011-02-16 15:10:24

+1

我误解了瀑布?我认为这个概念是当被引用的记录被删除时关系也被删除了?你会如何建议实现这一目标? – 2011-02-16 15:17:37

你必须执行,这个是有见解的INSTEAD OF删除触发器,以得到它的工作。喜欢的东西:

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) 

与级联删除和大量的外键的

通常情况下,你需要花时间来制定出一个“层叠”顺序,以便删除发生在“树”的顶部成功地级联到引用表。但在这种情况下这是不可能的。