SQL Server删除事件

时间:2018-11-21 20:06:14

标签: sql-server database cascade

我已经到处寻找这个问题的答案,但是我在尝试在我正在工作的数据库模型中的两个特定表之间实现级联删除条件时遇到了麻烦。在我进行部署时,SQL Server不断抛出错误,提示可能存在循环或多个级联路径。

考虑一个表foo,该表foo具有一个自动递增int的主键行。

fooid|Column1|Column2...
------------------
1
2

接下来考虑一个表格栏,该表格栏除其他事项外有两列,每列包含外键引用,这些外键引用返回foo中的id。

barId|fooRef1|Stuff|fooRef2
---------------------------

我正在尝试在foo和bar之间实现级联删除操作,以便如果foo中的行被删除,bar中包含该ID(在任一列中)的任何行也将被删除。有一个检查约束,即fooRef值在给定行中不能相同。当我尝试在两个外键行中都使用“ ON DELETE CASCADE”实现级联删除时,我得到关于循环和多个级联路径的相同部署错误。然后,我尝试在foo的delete事件上实现触发器,其中在删除一行时,它将删除外表设置为null的其他表中的所有行。但是在执行此操作时,当我然后删除bar中两行的检查约束和“ ON DELETE SET NULL”时,sql仍然给我该错误。

我知道,最简单的解决方法是更改​​模型,以使我只有一个外键引用到另一张表,但这并不是真正可行的。我还能做些什么来解决这个问题?

2 个答案:

答案 0 :(得分:1)

按照触发方式完成任务,尝试使用任意值(如99999)设置值并将其标记为父表中的Delete键,这样事情就很有意义了。 但是数据将永远保留在子表中。 或

   1. set reference keys to null 
   2. Disable constraint
   3. Delete data in child tables having ref key as null
   4. Enable constraint
   5. Delete parent keys

答案 1 :(得分:0)

作为参考,我从来没有真正弄清楚为什么会这样,但是我只通过在两个外键之一上包含删除级联来解决了这个问题