• mysql之触发器before和after的区别


    我们先做个测试:
    
    接上篇日志建的商品表g和订单表o和触发器
    
    假设:假设商品表有商品1,数量是10;
    
    我们往订单表插入一条记录:
    
    insert into o(gid,much) values(1,20);
    
    会发现商品1的数量变为-10了。这就是问题的所在,因为我们之前创建的触发器是after,也就是说触发的语句是在插入订单记录之后才执行的,这样我们就无法判断新插入订单的购买数量。
    
     
    
    先讲一下after和before的区别:
    
    after是先完成数据的增删改,再触发,触发的语句晚于监视的增删改操作,无法影响前面的增删改动作;也就是说先插入订单记录,再更新商品的数量;
    
    before是先完成触发,再增删改,触发的语句先于监视的增删改,我们就有机会判断,修改即将发生的操作;
    
     
    
    我们用一个典型案例来区分它们的区别,新建一个触发器:
    
    #监视地点: 商品表o
    
    #监视事件:insert
    
    #触发时间:before
    
    #触发事件:update
    
    案例:当新增一条订单记录时,判断订单的商品数量,如果数量大于10,就默认改为10
    
    create trigger tg6
    
    before insert on o
    
    for each row
    
    begin
    
      if new.much > 10 then
    
        set new.much = 10;
    
      end if;
    
      update g set num = num - new.much where id = new.gid;
    
    end$
    
    执行完,把之前创建的after触发器删掉,再来插入一条订单记录:
    
    insert into o(gid,much) valus(1,20)$
    
    执行完会发现订单记录的数量变为10,商品1的数量变为0了,就不会出现负数了。
    
  • 相关阅读:
    第01组 Beta版本演示
    2019 SDN上机第7次作业
    第01组 Beta冲刺(4/4)
    系统综合实践第6次作业
    系统综合实践第5次作业
    系统综合实践第4次作业
    系统综合实践第3次作业
    系统综合实践第2次作业
    系统综合实践第1次作业
    软工实践个人总结
  • 原文地址:https://www.cnblogs.com/zuochuang/p/7263848.html
Copyright © 2020-2023  润新知