微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在引用同一个表的两列上删除级联?

如何解决如何在引用同一个表的两列上删除级联?

我有一个项目表:

ID 姓名
1 祖父母
2 Parent1
3 Parent2
4 Child1

一个 ItemRelations 表:

ParentItemId ChildItemId
1 2
1 3
2 4

我正在尝试将 ParentItemId 和 ChildItemId 上的外键删除级联到 itemTable, 当我删除 GrandParent 时,我想保持 Parent1 和 Child1 之间的关系 但 sql 不让我:

'- 无法创建关系“FK_BlockRelations_Child”。 在表上引入 FOREIGN KEY 约束“FK_BlockRelations_Child” “BlockRelations”可能会导致循环或多个级联路径。指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其他 FOREIGN 关键约束。无法创建约束或索引。见上一个 错误。'

解决方法

父/祖父的概念似乎没有必要,因为如果您有递归的事情发生并且在任何时候,一个项目可以是子项、祖父项或父项。

无论如何,您都试图向数据库发出相互冲突的指令:

一方面,您是在说“我正在尝试在 ParentItemId 和 ChildItemId 到 itemTable 上使用删除级联的外键” 然后在下一句“当我删除 GrandParent 时,我想保留 Parent1 和 Child1 之间的关系,但 SQL 不允许我”

当您决定创建级联删除时,意味着您正在做两件事:

  1. 强制执行外键约束 - 对孤儿零容忍
  2. 基于这些外键约束,您正在执行删除项目时链接到项目的项目关系中的所有内容的操作

一旦您执行 (1),那么您将不能在项目中首先存在项目的情况下将项目添加到项目关系中。

如果您随后根据强制执行 #1 执行级联删除操作,则您需要选择在哪个字段上使用它。不能同时存在,除非两者都链接到不同的表,或者一个是级联的而另一个没有操作。

另一方面,如果您想删除祖父项并将项保留在项关系中,您的意思是您不再需要 #1 - 没有强制执行外部约束和对孤儿的容忍。

一旦你决定了你想要的,正确的方法应该是明确的。

如果您的删除级联和外键实施是有条件的并且基于父级的值,您可能需要完全放弃外键约束实施并考虑插入和删除触发器。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。