【发布时间】:2015-09-19 00:47:57
【问题描述】:
有一个简单的问题。 所以我有一个名为 PARENT 的表和一个名为 CHILD 的表,假设它们处于父子关系。当另一个表的数据被删除时,是否可以删除其中一个?
我最初的尝试是在删除 PARENT 记录时使用级联删除来删除 CHILD 记录。 同时我在删除 CHILD 的记录时使用触发器删除 PARENT 记录。(条件是在 CHILD 上删除后,触发触发器)
结果是 ORA-04091:表正在变异。 它会造成某种僵局。
父表已删除-->级联删除子表->触发器触发删除父表, 此时,PARENT中删除的记录并没有提交,所以我们处于一个边缘状态。
是否有可能以这种方式关联 Parent 和 Child 表的记录,如果一个被删除,另一个也会被杀死?我们假设这个 CHILD 表是唯一的子表,并且 CHILD 中具有外键的列与 PARENT 中的引用列具有 1 对 1 的关系。
编辑:我偶然发现了用于复合触发器的 oracle 文档,读起来很有趣。如果成功我会更新它。
【问题讨论】:
-
不能使用双向级联吗?
-
这甚至是oracle中的东西吗?但这可能是描述问题的最简单方法
-
只有在父级仍然存在的情况下,您可以让触发器尝试删除吗?
-
Parent 必须存在,因为外键引用它。所以问题是当父级被删除时,它会激活级联删除,然后触发子级触发。数据库必须在提交之前完成所有这些连锁反应。在它提交之前,父记录在技术上不会被删除。
-
我认为它应该与相互外键约束一起使用。将它们定义为“延迟”,否则您无法插入任何新数据
标签: database oracle parent-child cascading-deletes