5

我在UserPost之间有 1..* 关系。(一个用户有很多帖子)

Post有一个名为“UserId”的 FK,它映射到User表上的“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 的表。一篇文章有​​很多有用的。

Helpful 对 User 有一个级联的 FK(所以当一个 User 被删除时,他们的 Helpful 也会被删除)。

但我认为这是抱怨“多级联路径”的原因。

因为如果我删除用户(当前),它将删除他们的帮助。但是我也试图向 Post 添加一个级联,这样做会删除 Post,然后尝试删除该 Post 的 Helpful(因为 Helpful 也有一个级联的 FK 到 Post)。在那种情况下,SQL 会选择哪个级联 FK?

这是有问题的三个表的数据库图:

在此处输入图像描述

如您所见,“PostHelpful”是“Post”和“User”的子项(两者都有 FK)。

所以我不能让两个键级联?我是否需要在“用户”上触发(删除后)来手动删除帮助(以及引用用户的其他表)。

4

1 回答 1

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替换为Posts 。但是这样做时最好使用触发器来删除不太独立的实体的记录。换句话说,PostsUsersPostHelpfuls旁边的表相关的可能性比PostHelpfuls与UsersPosts旁边的表相关的可能性更大。

于 2011-03-02T08:43:50.043 回答