我的外键有问题。我创建了一组触发器,如果删除了表中的一行,则应该通过数据库级联删除,以便删除其所有子级(以及这些子级的子级)。这是此类触发器的示例。
create or replace trigger trigg_delet_child before delete on PARENT for
each row
begin
delete from CHILD where foreign_key_parent_id = :old.id_parent;
end;
我在每个表上都有一组这样的触发器。我已经假定,由于触发器应在执行 之前触发,因此将割炬传递到越来越低的桌子上,直到我们最终击中没有孩子的物品,然后从那里开始删除并继续前进
情况似乎并非如此,因为可以理解地违反了Foreign_key约束,因为显然我误解了BEFORE的工作方式。有没有一种方法可以避免这个问题,而无需指定foreign_key约束应该在删除时级联?
答案 0 :(得分:0)
我在下面的示例代码中对此进行了测试,它可以正常工作。 桌上还有其他触发器吗?或带有自引用FK的表?
Create table a (a_id number primary key,
a_text varchar2(10));
Create table b (b_id number primary key,
a_id number REFERENCES a (a_id),
b_text varchar2(10));
Create table c (c_id number primary key,
b_id number REFERENCES b (b_id),
c_text varchar2(10));
Insert into a values(1 , 'A');
Insert into b values(11, 1, 'B');
Insert into c values(101, 11, 'C');
commit;
-- Generates an error
Delete from a;
create or replace trigger A_DEL before delete on a for
each row
begin
delete from B where A_id = :old.A_ID;
end;
/
create or replace trigger B_DEL before delete on B for
each row
begin
delete from C where B_id = :old.B_ID;
end;
/
-- Works
Delete from a;
COMMIT;