sql-server - SQL Server 2008 - 多个级联 FK - 我需要触发器吗?

标签 sql-server sql-server-2008 foreign-keys cascading-deletes relationships

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

Post 有一个名为“UserId”的 FK,它映射到 User 表上的“UserId”字段。

我尝试将此 FK 设置为 Cascade UPDATE/DELETE,但收到此错误:

'Users' table saved successfully 'Posts' table - Unable to create relationship 'FK_Posts_Users'.
Introducing FOREIGN KEY constraint 'FK_Posts_Users' on table 'Posts' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints. Could not create constraint. See previous errors.

我有一个名为PostHelpful的表。一个帖子有很多有用的内容。

Helpful 具有到用户的级联 FK(因此,当删除用户时,其 Helpful 也会被删除)。

但我认为这就是提示“多级联路径”的原因。

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

这是相关三个表的数据库图:

enter image description here

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

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

最佳答案

这不是 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。但执行此操作时,最好使用触发器来删除独立程度较低的实体的记录。换句话说,Posts 更有可能与 UsersPostHelpfuls 旁边的表相关,而不是 PostHelpfuls用户帖子旁边的表格。

关于sql-server - SQL Server 2008 - 多个级联 FK - 我需要触发器吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5100525/

相关文章:

sql - SQL "IN"语句与使用 "OR"之间是否存在性能差异?

MySQL 约束使用固定 "hard-coded"值 - 这可能吗?

mysql 外键创建表

.net - TableAdapter 配置向导不喜欢 SP 中的临时表

SQL Server TRY...CATCH 与 XACT_STATE

sql-server - INSERT 语句与 FOREIGN KEY 约束冲突

MySQL 外键跳过检查失败-[错误代码 : 1025]

sql - 截断表和更新统计信息

sql-server - 遍历所有表并删除记录

sql-server - 从 java 8 连接到 microsoft sql 2008 r2