关于自引用表

时间:2017-02-14 13:58:17

标签: sql sql-server tsql

我有一个自我引用的评论表。 我尝试写删除级联,但它需要一些异常

  

介绍FOREIGN KEY约束' FK_Comments_Comments'在桌子上'评论'可能会导致循环或多个级联路径。指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY约束。

然后尝试编写一个触发器,但它再次出现异常

CREATE TRIGGER [dbo].[T_comment_Trigger]
    ON [dbo].[Comments]
    FOR DELETE
AS
    DELETE FROM Comments
    WHERE ParentId =(SELECT deleted.id FROM deleted)
  

无法删除包含子项的行

如何为我的自引用表删除级联?

1 个答案:

答案 0 :(得分:6)

假设您确保FOREIGN KEY约束到位,则无法在FOR DELETE触发器中解决问题。 触发器(也称为FOR触发器)在活动发生后触发。并且外键将阻止一行被删除(如果它有引用)。在删除之前发生外键检查。

您需要的是AFTER触发器。你还需要记住,你当前的触发器只是试图处理一个"级别"引用(因此,如果第3行引用第2行,第2行引用第1行,并删除第1行,则触发器仅尝试删除第2行)

所以,比如:

INSTEAD OF

如果存在其他(非自引用)级联外键约束,则它们都必须由此触发器中的操作替换。在这种情况下,我建议引入一个表变量来保存最终将从CREATE TRIGGER [dbo].[T_comment_Trigger] ON [dbo].[Comments] INSTEAD OF DELETE AS ;WITH IDs as ( select id from deleted union all select c.id from Comments c inner join IDs i on c.ParentID = i.id ) DELETE FROM Comments WHERE id in (select id from IDs); 表中删除的所有ID列表:

Comments