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不支持语句级触发器。
浙公网安备 33010602011771号