MySQL 触发器例子(下订单自动减少库存)
下订单自动减少库存,更改订单的时候纠正库存,恶意订单时纠正数量
来源:http://www.php100.com/html/webkaifa/database/Mysql/2013/0318/12231.html
解释的很好,但是代码都不可用,因此实际做了一遍。
现有如下两张表
1)商品表(库存表)
编号(id)名称(name)价格(price)库存(stock)
1 F16战斗机 10000 100
2 法拉利 800 70
3 航空母舰 5000 20
4 三栖交通工具 1000 50
DROP TABLE IF EXISTS shop;
CREATE TABLE shop(
id int(11),
name varchar(11),
price int(11),
stock int(11)
);
INSERT INTO shop(id,name,price,stock) values(1,'F16战斗机', 10000, 10);
INSERT INTO shop(id,name,price,stock) values(2,'法拉利', 800, 100);
INSERT INTO shop(id,name,price,stock) values(3,'航空母舰',5000, 11);
INSERT INTO shop(id,name,price,stock) values(4,'三栖交通工具', 1000, 30);
2)订单表
编号(id)商品编号(tid)购买数量(num)
DROP TABLE IF EXISTS commande;
CREATE TABLE commande(
tid int(11),
num int(11)
);
我们现在要买5架F16战斗机,下一个订单,需要做什么?
传统的做法:
insert into commande(tid,num) values(1,5);
update shop set stock = stock-5 where id = 1;
新的方式:
我们可以使用触发器,一触即发!!
触发器四要素:
地点:(表,table),
监视的事件:(insert,delete,update)
时间:(before/after)
触发的事件:(insert,delete,update)
需求:现在我们要购买10辆法拉利, 商品表里的触发器应该 这样写:
#商品表的触发器
delimiter ||
DROP TRIGGER IF EXISTS tg1_insert_shop ||
create trigger tg1_insert_shop
after -- 事件触发在 下订单之后
insert -- 监视插入事件
on commande -- 监视 order订单表
for each row
begin
update shop set stock=stock-new.num where id= new.tid; -- 注意这里是 old.id=new.tid
end ||
delimiter ;
执行在commande表的操作:
insert into commande(tid,num) values(2,10);
需求:先购买了10个辆法拉利,然后要把数量更改为5,写出触发器;
#商品表的触发器
delimiter ||
DROP TRIGGER IF EXISTS tg1_update_shop ||
create trigger tg1_update_shop
after
update
on commande
for each row
begin
update shop set stock = stock + old.num - new.num where id = new.tid; -- 监视更新,既不漏掉旧的,也不漏掉新的,计算差额
end ||
delimiter ;
测试:
update commande set num=8 where tid=2;
需求:若订单数量超过10的话,就认为是恶意订单,只让其购买10个。
Before:在监视事件发生之前触发的,触发事件要早于监视事件。
#商品表的触发器
delimiter $
create trigger tg_update_before
before
insert
on commande
for each row
begin
if new.num > 10 then
set new.num = 10;
end if;
update shop set stock = stock - new.num where id = new.tid;
end $
测试:
insert into commande(tid,num) values(2,22);