例如我有一个
TABLE child
ID ... PK
PARENT ... FK
PARENT2 ... FK
TABLE parent
ID ... PK
TABLE parent2
ID ... PK
使用外部API我将删除父行并通过数据库级联删除,因此每个子项也将被删除。但是我也希望删除parent2。通过在我的外键中使用ON DELETE选项,可以轻松地将设置设置为NULL或将删除级联到另一个方向,但有没有办法以相反的方式执行此操作?
我正在使用Oracle 11g
答案 0 :(得分:0)
由于您可以保证永远不会有多个子行引用parent
或parent2
中的同一行,因此您可以使用行级删除触发器
CREATE OR REPLACE TRIGGER remove_parent2_row
BEFORE DELETE ON child
FOR EACH ROW
BEGIN
DELETE FROM parent2 p
WHERE p.id = :old.parent2_id;
END;
通常,您假设父行可以有多个子行,在这种情况下,您需要三个触发器和一个包含集合的包,以确保父行仅在最后一个子行之后被删除删除。
答案 1 :(得分:0)
如果未在子表中使用,则要从父表中删除未使用的ID。正确?
您可以简单地创建一个程序来执行此操作:
创建或替换过程delete_unused_parents是
begin
delete from parent p
where not exists (select 1 from child c where p.id = c.parent);
delete from parent2 p
where not exists (select 1 from child c where p.id = c.parent2);
commit;
end delete_unused_parents;
下一步是定期运行此过程,这可以通过创建一个数据库作业来定期运行(每天,或两个小时......无论你想要什么),这将调用此过程。