三、触发器:触发trigger (枪击、扳机、引线)
作用:监视某种情况并触发某种操作,可以监视增删改,触发增删改
监视对象:表
监视操作:insert
触发操作:update
触发时间:after
创建触发器语法:
create trigger 触发器名称 after/before insert/update/delete on 表名 for each row begin sql语句 end;
改变mysql结束符:delimiter 结束符,可以是#、$等,默认是;分号
>delimiter $
>create trigger tg1 after insert on o for each row begin update g set num=num-3 where id=2; end$
如何在触发器中引用行的值,对于新增的行用new表示,行中每一列的值用 new.列名 表示
1、添加订单,库存减少
>create trigger tg2 after insert on o for each row begin update g set num=num-new.muth where id=new.gid; end$
删除触发器语法:drop trigger 触发器名
实例:2、删除一个订单时,库存相应增加
删除之前的数据用old引用,数据列用old.列名
>create trigger tg3 after delete on o for each row begin update g set num=num+old.much where id=old.gid; end$
> delete from o where oid=2$
此时订单被删除,库存相应增加
3、修改一个订单购买数量时,库存相应改变
对于update,修改前的数据用old表示old.列名 引用修改前的数据,
修改后的数据用new表示,new.列名
>create trigger tg4 after update on o for each row begin update g set num=num+old.much-new.much where id=old.gid; end$
触发器after和before区别:
after是先完成数据的增删改,再触发,触发监视中的语句晚于增删改,无法影响前面的增删改
Before是先完成触发在增删改,触发的语句先与触发增删改,我们有机会判断修改即将发生的增删改操作
案例:对于所下订单进行判断,如果订单数量大于5,就认为是恶意订单,强制吧所下订单商品改为5
对同一表进行的同一触发器不能重复,比如不能有两个insert、两个update、或两个delete,否则会出现执行两次触发器,可以删除一个触发器,“drop trigger 触发器名”,
create trigger tg5
before insert on o
for each row
begin
if new.much > 5 then
set new.much = 5;
end if;
update g set num = num - new.much where id=new.gid;
end$
创建触发器:creater trigger;
删除触发器:delete trigger;
如何查看触发器:show triggers;