(17)触发器trigger

一、触发器引入

这里写图片描述

二、应用场合

作用:监视某种情况并触发某种操作
能监视:增删改
触发作用:增删改
应用场景:业务逻辑上操作不可分割
这里写图片描述

三、创建语法之四要素

监视地点:table
监视事件:insert /update/delete
触发时间:after/before
触发事件:insert /update/delete

创建语法:
delimiter $(虽然不是创建的语法,但是必须这样做)
create trigger triName after/before insert/update/delete on 表名
for each row
begin
sql语句(触发事件)
end;

create table g(
id int,
name varchar(10),
num int)charset utf8;

create table  o(
oid int,
gid int,
much int)charset utf8;

insert into g values(1,'猪',22);
insert into g values(2,'羊',19);
insert into g values(3,'狗',12);
insert into g values(4,'猫',8);

//要买3只羊
insert into o values (1,2,3);

//手动,在商品中减少3只羊
update g set num=g.num-3 where id=2;

监视地点:o    监视操作:insert   触发操作:update  触发时间after
delimiter $(修改结束符,为$,因为在触发器中要写sql语句,要用.作为每条语句的结束符,若不修改,则在sql语句处就结束了,
而后面的end不会执行,这就不能构成完整的触发器语句,会有语法错误)

create trigger tri after insert on o
for each row
begin 
update g set num=num-3 where id=2;
end$

insert into o values(2,2,3)$(再看g表羊就减少了3,这是一个简单的触发器,并不能减少相应的商品,)

四、删除触发器、还有正确的触发器sql写法

①添加(insert)订单:订单增加一行,所以是new.列名
对于insert而言,新增的行,用new表示,行中的每一列的值,用new.列名来表示

这里写图片描述

//删除触发器,drop trigger tri$
//创建触发器
create trigger tri after insert on o
for each row
begin 
update g set num=num-new.much where id=new.gid;
end$

②删除(delete)订单,库存增加,o中删除相当于旧值old
对于delete来说,原本有一行,后来被删除,想要引用被删除的这一行,old来表示,old.列名
就可以引用被删除的行的值
这里写图片描述

//删除一个订单,库存相应增加
监视操作:delete 触发操作:update  
drop trigger if exists tri$
create trigger tri after delete on o
for each row
begin
update g set num = num + old.much where id=old.gid;
end$

③修改订单的数量值,库存相应改变,对于库存思想:先将撤销的订单加上,再减去更新后订单的值

对于update来说,被修改的行,修改前的数据状态,用old来表示,old.列名可以引用被修改之前行中的值
修改后的数据,用new来表示,new.列名引用被修改之后的行中的值

这里写图片描述

//修改(update)订单的数量值,库存相应改变
触发事件:update  监视事件:update
drop trigger if exists tri$
create trigger tri after update on o
for each row
begin 
update g set num =num+old.much-new.much where id=old.gid;(先撤销再减少)
end$

update o set much=6 where oid=4;

五、after与before的区别

after 是先完成数据的增删改,再触发,触发中的语句晚于增删改,也就是不能对之前的增删改产生影响
before是先完成触发,再增删改
触发的语句先于监视的增删改,我们有机会,修改即将发生的增删改


//对于所下订单,进行判断,如果订单的数量大于5,则认为是恶意订单,强制将所定的商品数目改为5
监视地点:o  监视操作:insert  触发操作:update 触发事件:before
delimiter $
drop trigger if exists tri$
create trigger tri 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$
insert into o values(5,1,100);

六、查看触发器
show triggers

posted @ 2017-08-14 23:21  测试开发分享站  阅读(211)  评论(0编辑  收藏  举报