我与用户和发布之间存在1 .. *关系。 (一个用户有很多帖子)
帖子有一个名为“UserId”的FK,它映射到用户表上的“UserId”字段。
我尝试将此FK设置为Cascade UPDATE / DELETE,但是我收到此错误:
'用户'表已成功保存 '帖子'表 - 无法创建关系'FK_Posts_Users' 在表'Posts'上引入FOREIGN KEY约束'FK_Posts_Users'可能会导致循环或多个级联路径。指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY约束。 无法创建约束。查看以前的错误。
我有一张名为 PostHelpful的表。 One Post有很多帮助。
有用的是向用户级联FK(因此当用户被删除时,他们的帮助也会被删除)。
但我认为这是“多重级联路径”投诉的原因。
因为如果我删除用户(当前),它将删除他们的帮助。但我试图添加一个cacade也发布,它会删除帖子,然后尝试删除该帖子的有用的(有帮助也有一个级联FK发布)。在那种情况下,SQL会选择级联FK吗?
以下是有问题的三个表的数据库图表:
正如你所看到的,“PostHelpful”是“Post”和“User”的孩子(两者都有FK)。
所以我不能让两个键级联?我是否需要在“用户”(AFTER DELETE)上触发以手动删除有用的(以及引用用户的其他表)。
答案 0 :(得分:3)
这不是SQL Server选择哪条路径的问题,它不允许它以便它不会在一个妥协的位置结束。当我们遇到这种情况时,我们不得不求助于触发器。
1)如上所述,请将 Users_PostHelpfuls FK更改为 ON DELETE NO ACTION 。
2)向用户添加 INSTEAD OF DELETE 触发器:
CREATE TRIGGER dbo.Users_IO_Delete
ON dbo.Users
INSTEAD OF DELETE
AS
BEGIN;
DELETE FROM dbo.PostHelpfuls WHERE UserId IN (SELECT UserId FROM deleted);
DELETE FROM dbo.Users WHERE UserId IN (SELECT UserId FROM deleted);
END;
现在,FK仍将强制执行DRI,但触发器是级联删除而不是FK约束。
您可以在上述步骤中将 PostHelpfuls 替换为帖子。但是在执行此操作时,最好使用触发器来删除不太独立的实体的记录。换句话说,帖子更有可能与用户和 PostHelpfuls 旁边的表相关,而 PostHelpfuls 与用户和帖子旁边的表格。