首页 > 解决方案 > 对同一个表有多个外键但删除时不同会导致错误

问题描述

我有一个简单的表,其中有 2 个外键指向同一个表中的不同用户:

CREATE TABLE [dbo].[InstallerDetails]
(
    [UserId] int NOT NULL PRIMARY KEY 
         FOREIGN KEY REFERENCES Users(Id) ON DELETE CASCADE,
    [AssignedSalesman] int NULL
         FOREIGN KEY REFERENCES Users(Id) ON DELETE SET NULL,
    ...some more columns
)

UserId指向所需的用户,当该用户被删除时,我也想删除其详细信息。

AssignedSalesman指向其他用户,这是可选的,我想在删除该用户时设置 null 。

但是,这种结构会导致错误:

在表“InstallerDetails”上引入 FOREIGN KEY 约束“FK__Installer__Assig__6D0D32F4”可能会导致循环或多个级联路径。指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其他 FOREIGN KEY 约束。

我不明白它如何导致循环。这真的是一个错误吗?有没有其他方法可以实现这种逻辑?

标签: sqlsql-server

解决方案


一个例子:

+-------+--------+--------------------+
| RowID | UserId | [AssignedSalesman] |
+-------+--------+--------------------+
|     1 | userA  | userB              |
|     2 | userB  | userC              |
|     3 | userC  | userD              |
+-------+--------+--------------------+

如果你delete .. where RowID=1

然后突然所有行都是空的。我想这就是 SQL Server 试图避免的。(不过,我也希望能够停用此检查)。


推荐阅读