zoukankan      html  css  js  c++  java
  • 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);

  • 相关阅读:
    SQL学习
    FOR XML PATH
    IOS学习网址
    weak nonatomic strong等介绍(ios)
    UVALive3045 POJ2000 ZOJ2345 Gold Coins
    UVA713 UVALive5539 POJ1504 ZOJ2001 Adding Reversed Numbers
    UVA713 UVALive5539 POJ1504 ZOJ2001 Adding Reversed Numbers
    UVA439 POJ2243 HDU1372 ZOJ1091 Knight Moves【BFS】
    UVA439 POJ2243 HDU1372 ZOJ1091 Knight Moves【BFS】
    UVA10905 Children's Game
  • 原文地址:https://www.cnblogs.com/findumars/p/3092049.html
Copyright © 2011-2022 走看看