【问题标题】:CASCADE Delete in many-to-many self-reference table多对多自引用表中的 CASCADE 删除
【发布时间】:2013-11-11 15:59:02
【问题描述】:

DISPLAY_TAB 下面是一个自引用表,可以包含父标签和子标签。一个父选项卡可以有多个子选项卡,一个子选项卡可以属于多个父选项卡。

我想在主表和关系表 DISPLAY_TAB_GROUPING 之间建立 CASCADE DELETE 关系,所以当父标签或子标签被删除时 - 关系也会自动删除(只是关系,而不是实际标签记录)。因此,我在 DISPLAY_TAB_GROUPING 上为字段 TAB_ID_R_1 和 TAB_ID_R_2 表创建 FOREIGN KEY 约束,引用 DISPLAY_TAB 表中的 TAB_ID。它工作正常,当我为其中一个关系添加 ON DELETE CASCADE 时,它工作正常,但是当我对两者都尝试时 - 它会抛出一个错误,即 “可能导致循环或多个级联路径” .

如何为这两种关系设置 ON CASCADE DELETE?我看不出这会如何导致循环 - 每次删除主表中的记录时,只应删除关系表中的相关记录。

【问题讨论】:

  • 您可以在触发器中使用 CTE 来确定所有相关行并将它们一起删除。
  • 错误信息显示“可能导致循环...”,这意味着技术上这样的可能性。 DISPLAY_TAB 行可以是 DISPLAY_TAB_GROUPING 中的子项和父项,如果两个 ON CASCADE DELETE 设置都有效,删除它确实会导致多个级联路径。
  • @AndriyM 感谢您的澄清,我看不到。从逻辑上讲,孩子不能成为自己的父母,但我可以看到技术上的可能性。
  • 我的意思是它可能是一行的父行和另一行的子行。
  • @AndriyM 在我的情况下这是一个单级关系,但我明白你的意思。

标签: sql tsql foreign-keys cascade cascading-deletes


【解决方案1】:

阅读this KB 文章,其中包含以下内容...

您收到此错误消息是因为在 SQL Server 中,表不能 在所有级联引用的列表中出现多次 由 DELETE 或 UPDATE 语句启动的操作。 例如,级联引用操作的树必须只有 级联引用操作上特定表的一条路径 树。

要执行您想要的操作,DISPLAY_TAB_GROUPING 表必须出现两次。我建议您改用实现删除代码的存储过程。

【讨论】:

  • 谢谢。我希望避免删除代码,但看起来这是唯一的方法。
猜你喜欢
  • 2013-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-11
  • 1970-01-01
  • 2015-06-13
相关资源
最近更新 更多