oracle关于删除级联条件

Posted

技术标签:

【中文标题】oracle关于删除级联条件【英文标题】:oracle on delete cascade with condition 【发布时间】:2016-11-22 06:36:36 【问题描述】:

我在表 B 到表 A 中有一个外键。我想要的是删除 A 中的记录,在 B 的 FK 字段中使用级联删除或级联集 NULL 取决于该列中的值记录,应该删除。

就我不能在删除级联中使用条件而言,我的想法是始终使用级联 SET NULL 并将触发器添加到表 B

AFTER UPDATE..
FOR EACH ROW
BEGIN
   IF :new.a = 1 THEN
       DELETE FROM B WHERE ID = :new.id
   ENDIF;
END; 

但我收到一个错误,类似于“表正在变异,触发器/函数可能看不到它”。

所以,我已将 if-else 更改为过程调用

AFTER UPDATE
BEGIN
    cleanup_table_b();
END;

create or replace procedure cleanup_table_b
IS begin    
    DELETE FROM B WHERE a = 1;    
end;

但还是报错 ORA-04091, ORA-06512, ORA-04088

这样做的商业理念是,B 中的记录是否仍然有用(不是通过外键),所以我想执行清理并删除有用记录。

【问题讨论】:

在表 A 上使用 on delete 触发器删除表 B 中的引用记录或将其设置为 null。 @Rene 是的,但这就是制作一张桌子来维护另一张桌子。更好的结构解决方案是如果表可以保持自身 你必须解释为什么你认为这样“更好”。 你误以为B表独立于A表。 因为如果是你就不会在这里问这个问题。 A 发生了一些变化,现在需要对表 B 采取行动。 【参考方案1】:

实施了以下决定。已在表 A 上使用“on delete”触发器来删除表 B 中的引用记录或将其设置为 null。因此 delete 触发器运行了 B 的清理

【讨论】:

以上是关于oracle关于删除级联条件的主要内容,如果未能解决你的问题,请参考以下文章

Oracle Delete inner的方式,级联删除子表的数据方式。

Oracle级联删除

数据库中啥是“级联更新关联字段”和“级联删除关联字段”

oracle级联查询的问题

Oracle啥是级联查询

java:Oracle(级联删除,左右内外交叉自然连接,子查询,all,any,in)