sql - 对同一个表有多个外键但删除时不同会导致错误
问题描述
我有一个简单的表,其中有 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 约束。
我不明白它如何导致循环。这真的是一个错误吗?有没有其他方法可以实现这种逻辑?
解决方案
一个例子:
+-------+--------+--------------------+
| RowID | UserId | [AssignedSalesman] |
+-------+--------+--------------------+
| 1 | userA | userB |
| 2 | userB | userC |
| 3 | userC | userD |
+-------+--------+--------------------+
如果你delete .. where RowID=1
然后突然所有行都是空的。我想这就是 SQL Server 试图避免的。(不过,我也希望能够停用此检查)。
推荐阅读
- java - Java - 记录对象(CustomException)实例化的注释?
- php - php中带有3维数组的foreach
- ruby-on-rails - Ruby on Rails:在初始化程序中访问 ActionController::API 后没有 API 响应主体
- loops - for in range() 在 tkinter 内
- batch-file - su daemon 命令卡在批处理文件中
- amazon-web-services - 在 EMR 中设置 spark.driver.maxResultSize
- next.js - 在构建中使用服务器变量进行开发和生产
- flutter - Flutter 模拟 ChangeNotifierProvider 并设置提供程序值
- arrays - 如何分隔字符串并按 C 中的左数对每条记录进行排序
- java - 错误:包 android.support.annotation。不存在