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关于删除级联条件的主要内容,如果未能解决你的问题,请参考以下文章