💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
### 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了,就不会出现负数了。