MySQL触发器

触发器

触发器是一类特殊的事务,可以监视某种数据操作(insert/update/delete),并触发相关操作(insert/update/delete)

触发器创建语法之4要素:

监视地点(table),监视事件(insert/update/delete),触发时间(after/before),触发事件(insert/update/delete)。

创建触发器语法:

create trigger 触发器名称
after/before (触发时间)
insert/update/delete (监视事件)
on 表名(监视地点)
for each row
begin
sql1;
...
sqlN;
end 
--此时创建的触发器无法自适应变量,每次更新的都是gid=1
delimiter $$
    create trigger t1
    after insert
    on ord
    for each row
    begin
    update goods set num = num-2 where gid=1;
    end$$
delimiter ; 

触发器引用行变量 insert 新行new,delete 旧行 old,一张表不能同时建立2个触发器来监视同一个动作。

查看已有triggers:

show triggers 

删除已有trigger:

drop trigger triggerName 

监测插入insert操作

delimiter $$
    create trigger t2
    after insert
    on ord
    for each row
    begin
    update goods set num = num-new.much where gid=new.gid;
    end$$
delimiter ;

监测删除delete操作

delimiter $$
    create trigger t3
    after delete
    on ord
    for each row
    begin
    update goods set num = num+old.much where gid=old.gid;
    end$$
delimiter ; 

监测更新update操作

delimiter $$
    create trigger t4
    before update
    on ord
    for each row
    begin
    update goods set num = num+old.much-new.much where gid=old.gid;
    end$$
delimiter ;
--如果剩余1件商品,但客户买了10件商品,发生什么情况,怎样预防? --当为after时,报:Updating of NEW row is not allowed in after trigger --原因:insert之后,new行已经插入到表中,成为事实,改new已经晚了。 delimiter $$ create trigger t8 before insert on ord for each row begin declare rnum int; select num into rnum from goods where gid = new.gid; if new.much > rnum then set new.much = rnum; end if; update goods set num = num-new.much where gid=new.gid; end$$ delimiter ;

for each row

是声明行级触发器,在oracle中,触发器分语句级触发器,和行级触发器,如:

create triggers t4
before update
on ord
for each row  --每一行受影响,触发器都执行,叫做行级触发器
begin
insert into tmp values (5);
end 

在oracle中,for each row如果不写,无论update语句一次影响了多少行,都只执行1次,比如:1个人下了订单,买了5件商品,insert 5次,可以用行级触发器,修改5次库存,用语句级触发器,insert一条发货提醒,但mysql不支持语句级触发器。

 

posted on 2015-06-27 13:32  gimin  阅读(186)  评论(0)    收藏  举报