让Oracle删除父行

时间:2014-04-11 18:01:59

标签: sql oracle oracle11g

例如我有一个

TABLE child
ID      ... PK
PARENT  ... FK
PARENT2 ... FK

TABLE parent
ID  ... PK

TABLE parent2
ID ... PK

使用外部API我将删除父行并通过数据库级​​联删除,因此每个子项也将被删除。但是我也希望删除parent2。通过在我的外键中使用ON DELETE选项,可以轻松地将设置设置为NULL或将删除级联到另一个方向,但有没有办法以相反的方式执行此操作?

我正在使用Oracle 11g

2 个答案:

答案 0 :(得分:0)

由于您可以保证永远不会有多个子行引用parentparent2中的同一行,因此您可以使用行级删除触发器

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_pa​​rents是

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;

下一步是定期运行此过程,这可以通过创建一个数据库作业来定期运行(每天,或两个小时......无论你想要什么),这将调用此过程。