我之间有 1..* 关系User and Post。 (一个用户有多个帖子)
Post有一个名为“UserId”的 FK,它映射到上的“UserId”字段User table.
我尝试将此 FK 设置为 Cascade UPDATE/DELETE,但出现此错误:
“用户”表已成功保存
“帖子”表
- 无法创建关系“FK_Posts_Users”。
在表“Posts”上引入 FOREIGN KEY 约束“FK_Posts_Users”可能会导致循环或多个级联路径。指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其他 FOREIGN KEY 约束。
无法创建约束。请参阅以前的错误。
我有一张桌子叫帖子有帮助。一篇文章有很多有用的内容。
Helpful 具有到用户的级联 FK(因此,当删除用户时,其 Helpful 也会被删除)。
但我认为这就是抱怨“多级联路径”的原因。
因为如果我删除一个用户(当前),它将删除他们的帮助。但我也尝试向帖子添加一个级联,这样做会删除该帖子,然后尝试删除该帖子的“有用”(因为“有用”也有一个到“帖子”的级联 FK)。在这种情况下,SQL 会选择哪个级联 FK?
这是所讨论的三个表的数据库图:
正如您所看到的,“PostHelpful”是“Post”和“User”的子级(两者都有 FK)。
所以我不能让两个键级联吗?我是否需要“用户”上的触发器(删除后)来手动删除帮助信息(以及引用用户的其他表)。
SQL Server 选择哪条路径并不重要,它不允许这样做,这样它就不会陷入妥协的境地。当我们遇到这种情况时,我们不得不求助于触发器。
1)根据错误提示,修改用户帖子帮助 FK to 删除时不执行任何操作.
2)添加一个而不是删除触发用户:
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 约束。
你可以替换帖子帮助者 with Posts在上述步骤中。但执行此操作时,最好使用触发器来删除不太独立的实体的记录。换句话说,更有可能的是Posts与旁边的表相关Users and 帖子帮助者 than 帖子帮助者与旁边的表相关Users and Posts.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)