mysql-触发器专题
触发器trigger
触发器(trigger):监视某种情况,并触发某种操作。
触发器创建语法四要素:1.监视地点(table) 2.监视事件(insert/update/delete) 3.触发时间(after/before) 4.触发事件(insert/update/delete)
语法:
create trigger triggerName
after/before insert/update/delete on 表名
for each row #这句话在mysql是固定的
begin
sql语句;
end;
示例:
#商品表
create table g
(id int primary key,
gname varchar(20),
num int
);
#订单表
create table o
(oid int primary key,
oname char(20),
much int
);
insert into g(id,gname,num) values (15001,'商品1',10),(15002,'商品2',10),(15003,'商品3',10),(15004,'商品4',10),(15005,'商品5',10);
delimiter $
create trigger tg1
after insert on o
for each ROW
BEGIN
update g set num=num-new.much where id=new.oid;
end ;
$ #delimiter $.....$这中间的语句是完整的触发器部分
insert into o(oid,oname,much) values (15001,'商品1',5);
***************************************************************
顾名思义,new是新插入的数据,old是原来的数据
insert只会有new,代表着要插入的新记录
delete只会有old,代表着要删除的记录
update由于执行的是先删除旧的记录,再插入新的记录,因此new和old都会有,且含义与上面的相同
new在before触发器中赋值,取值;在after触发器中取值。
***************************************************************
现在还存在两种情况:
1.当用户撤销一个订单的时候,我们这边直接删除一个订单,我们是不是需要把对应的商品数量再加回去呢?
2.当用户修改一个订单的数量时,我们触发器修改怎么写?
我们先分析一下第一种情况:
监视地点:o表
监视事件:delete
触发时间:after
触发事件:update
对于delete而言:原本有一行,后来被删除,想引用被删除的这一行,用old来表示,old.列名可以引用被删除的行的值。
那我们的触发器就该这样写:
delimiter $
create trigger tg3
after delete on o
for each row
BEGIN
update g set num=num+old.much where id=old.oid;
end$
执行:delete from o where oid=15001;
商品又回到原来的数据了
第二种情况:
监视地点:o表
监视事件:update
触发时间:after
触发事件:update
对于update而言:被修改的行,修改前的数据,用old来表示,old.列名引用被修改之前行中的值;
修改的后的数据,用new来表示,new.列名引用被修改之后行中的值。
那我们的触发器就该这样写:
delimiter $
create trigger tg4
after update on o
for each ROW
BEGIN
update g set num=num+old.much-new.much where id=new.oid; #思考下为什么不是new.much-old.much?
end$
执行:update o set much=3 where oid=15004;
此时发现g表同时也更新了
触发器暂时学到这里,以后用到的时候再深入学习
本文主要参考:http://www.cnblogs.com/zzwlovegfj/archive/2012/07/04/2576989.html

浙公网安备 33010602011771号