【发布时间】:2018-12-11 10:33:43
【问题描述】:
我已经四处寻找这个问题的答案,但是我在尝试在我正在工作的数据库模型中的两个特定表之间实现级联删除条件时遇到了麻烦。当我去部署时,SQL Server 一直抛出一个错误,说可能存在循环或多个级联路径。
考虑一个表 foo,它的主键行是自动递增的 int。
fooid|Column1|Column2...
------------------
1
2
接下来考虑一个表格栏(除其他外),它有两列,每列都包含指向 foo 中 id 的外键引用。
barId|fooRef1|Stuff|fooRef2
---------------------------
我正在尝试在 foo 和 bar 之间实现级联删除操作,这样如果 foo 中的一行被删除,则 bar 中包含该 id 的任何行(在任一列中)也会被删除。存在一个检查约束,即 fooRef 值在给定行中不能相同。当我尝试在两个外键行中使用“ON DELETE CASCADE”实现级联删除时,我得到关于循环和多个级联路径的相同部署错误。然后我尝试在 foo 的删除事件上实现触发器,在删除一行时,它将删除其他表中的所有行,外键设置为空。然而,在实现这一点时,当我删除 bar 中两行的检查约束和“ON DELETE SET NULL”时,sql 仍然给我这个错误。
我知道最简单的解决方法是更改模型,以便我只有一个外键引用另一个表,但这并不可行。我还能做些什么来解决这个问题?
【问题讨论】:
-
您遇到的部署错误的确切措辞是什么?
-
它是关于由于循环或多个级联路径的可能性应该如何更改外键约束(对不起,我会在问题定义中更清楚地说明)
-
如果我在 bar 中的外键上有一个“On Delete SET”条件,并且在 foo 上有一个 onDelete 触发器来删除 bar 中的条目,那么设置和删除操作可能会是这样吗?不会像我认为的那样发生,这就是导致“循环和级联路径”错误的原因?
-
我的猜测是 SQL 无法知道 fooRef1 和 fooRef2 中是否存在相同的 fooid;如果是这种情况,则必须两次删除同一记录。 TBH,在同一个表中有两个字段指向同一个字段似乎是一个奇怪的设计选择,但我想这超出了范围
标签: sql-server database cascade