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

  • 相关阅读:
    考试中一元三次方程的解法
    变限积分求导公式--加上自己理解
    柯西中值定理
    sec x的积分及注意事项
    线性代数
    IntelliJ IDEA无法新建类解决办法
    idea中Server returns invalid timezone. Go to 'Advanced' tab and set 'serverTimezone' property manually.
    Windows 64位下安装Redis 以及 可视化工具Redis Desktop Manager的安装和使用
    使用@Param注解
    关于在方法里面使用泛型public static <T> T
  • 原文地址:https://www.cnblogs.com/findumars/p/3092049.html
Copyright © 2011-2022 走看看