今天遇到需要级联删除的情况,在网上找到 一些级联删除的办法,其中个人认为最简便的是使用触发器实现级联删除,因为普遍实现级联删除的做法都是修改constraint来达到目的的,这样稍微麻烦了一些。
一,触发器解决级联删除
sql语句如下:
其中TUDI_LOG中的TDID为外键,参考的是TUDI中的TDID。
delete from TUDI where TDNAME='测试';
create or replace trigger delete_tudi
before delete on TUDI
for each row
begin
delete from TUDI_LOG where TDID = :old.TDID;
end;
二,触发器格式
我还是初学oracle,对触发器还不太熟悉,所以查阅了关于触发器的资料,了解到触发器的格式为:
create [or replace] trigger trigger_name
before|after
event1 [ or event2 or event3 …]
on table_name [for each row]
begin
statement;
…
end;
/*event通常是insert、delete或update等DML操作
For each row的意义是:在一次操作表的语句中,每操作成功一行就会触发一次;不写的话,表示是语句级触发器,则无论操作多少行,都只触发一次;
*/
触发器分为语句级触发器和行级触发器,区别就是语句级触发器执行一次DML语句执行一次,而行级触发器是DML每操作一条记录就触发一次,而行级触发器就涉及到新值和旧值。
三,新值和旧值
关键字: :new和:old
new 出现在insert和update,在insert中表示将要插入的新数据,在update中表示更新后的新数据;old在delete和update中出现,在delete中表示将要被删除的数据,在update中表示将要被替换的旧数据。
详细触发器关于:new和:old的入门参考下面链接:
触发器学习笔记(:new,:old用法)