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);

原文地址:https://www.cnblogs.com/findumars/p/3092049.html