本文共 1414 字,大约阅读时间需要 4 分钟。
MySQL 触发器trigger
触发器:
监视某种情况并且触发某种操作触发器创建语法的四要素:
1. 监视地点 table2. 监视事件 insert/update/delete3. 触发时间 after/before4. 触发事件 insert/update/delete
语法:
create trigger triggerNameafter/before insert/update/delete on 表名for each row #这句话在mysql是固定的begin sql语句;end;
例子:
数据准备#商品表create table g( id int primary key auto_increment, name varchar(20), num int);#订单表create table o( oid int primary key auto_increment, gid int, much int);insert into g(name,num) values('商品1',10),('商品2',10),('商品3',10);
如果我们在没使用触发器之前:假设我们现在卖了3个商品1,我们需要做两件事
1.往订单表插入一条记录
insert into o(gid,much) values(1,3);
2.更新商品表商品1的剩余数量
update g set num=num-3 where id=1;
创建一个触发器
create trigger tg1after insert on ofor each row beginupdate g set num=num-new.much where id=new.gid;(注意此处和第一个触发器的不同)end$
这样当往订单表中插入数据时就会自动更新商品表的数据
另外两种情况
当用户撤销一个订单的时候,订单表直接删除一个记录,商品表的数量要还原
create trigger tg2after delete on ofor each rowbeginupdate g set num = num + old.much where id = old.gid;end
修改订单表中记录的数量时也要相应的修改商品表中的剩余数量
create trigger tg3 after update on ofor each rowBEGINupdate g set num = num+old.much-new.much where id = new.gid;end
现在还可能存在一个问题,就是当订单中插入的数量大于商品剩余数量,那么商品剩余数量更新出来的结果就是负数,解决方法就是在订单表插入数据之前进行判断,判断要插入的数量是否大于商品的剩余数量
create trigger tg4before insert on ofor each ROWBEGIN SET @num = (select num from g where id = new.gid); if new.much > @num then set new.much = @num; end IF; update g set num = num - new.much where id = new.gid;end
转载地址:http://hhqli.baihongyu.com/