我有一个自我引用的评论表。 我尝试写删除级联,但它需要一些异常
介绍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)
无法删除包含子项的行
如何为我的自引用表删除级联?
答案 0 :(得分:6)
假设您确保FOREIGN KEY
约束到位,则无法在FOR DELETE
触发器中解决问题。 1>触发器(也称为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