级联删除可与自身相关的对象

时间:2011-02-03 09:57:13

标签: tsql sql-server-2008 constraints

在我的数据库中,我有许多可以相互关联的对象。

这很好,直到我决定要删除这些对象。由于关系记录,我需要实现级联删除以防止抛出异常。

当删除关系两侧的对象时,我也希望删除关系记录。我想创建一个如下所示的数据库结构:

CREATE TABLE [MyObject]
(
     [ID] [int] IDENTITY PRIMARY KEY,
     ...
);

CREATE TABLE [MyObjectRelation]
(
     [ID] [int] IDENTITY PRIMARY KEY,
     [MyObjectID] [int] FOREIGN KEY REFERENCES [MyObject] ([ID]) ON DELETE CASCADE,
     [RelatedMyObjectID] [int] FOREIGN KEY REFERENCES [MyObject] ([ID]) ON DELETE CASCADE
)

但是,每当我尝试在我的数据库上运行它时,都会收到以下错误消息:

  

在表'MyObjectRelation'上引入FOREIGN KEY约束'...'可能会导致循环或多个级联路径。指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY约束。

我已阅读有关此内容的文档,但我看不出此布局如何导致循环。当然,我完全有可能误解了MSDN上用于级联删除的文档,并且上面的数据库布局无法实现我想要的。

我很想听听我能做些什么来实现我想要的行为。

1 个答案:

答案 0 :(得分:1)

您收到此错误消息,因为在SQL Server中,一个表不能出现多次在由DELETE或UPDATE语句启动的所有级联引用操作的列表中。例如,级联引用操作树必须只有一条到级联引用操作树上特定表的路径。

您可以使用触发器来实现相同的行为。