设为首页 收藏本站
查看: 704|回复: 0

[经验分享] mysql基础三 触发器

[复制链接]

尚未签到

发表于 2018-10-6 09:15:42 | 显示全部楼层 |阅读模式
  商品表-- Table "goods" DDL:
  CREATE TABLE goods (
  gid int(11) NOT NULL,
  name varchar(20) DEFAULT NULL,
  num smallint(6) DEFAULT NULL,
  PRIMARY KEY (gid)
  ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  订单表-- Table "orders" DDL:
  CREATE TABLE orders (
  oid int(11) NOT NULL,
  gid int(11) DEFAULT NULL,
  much smallint(6) DEFAULT NULL,
  create_time datetime DEFAULT NULL,
  PRIMARY KEY (oid)
  ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  一、insert触发器:
  (1)、after触发器:
  需求:客户购买某个商品后,商品的库存数量自动减少。
  create trigger trigerafterInsertOrder
  after  insert
  on  orders
  for each row
  begin
  

update goods set num=num-new.much where gid=new.gid;  

  end;
  (2)、before触发器:
  需求:客户购买某个商品后,商品的库存数量自动减少。
  同时订单表的create_time为当前时间。
  create trigger trigerbeforeInsertOrder
  before  insert
  on  orders
  for each row
  begin
  update goods set num=num-new.much where gid=new.gid;
  set new.create_time=now();
  end;
  注意:new 表示orders表新增行。
  二、delete触发器:
  需求:客户取消订单后,商品表的库存数量自动增加。
  create trigger triggerDeleteOrder
  after delete
  on  orders
  for each row
  begin
  

update goods set num=num+old.much where gid=old.gid  

  end;
  注意:old 表示orders表删除行。
  三、update 触发器:
  需求:客户修改订单购买的数量,商品表的库存数量自动改变。
  create trigger triggerUpdateOrder
  before update
  on orders
  for each row
  begin
  

update goods set num=num+old.much-new.much where gid=old.gid;  

  end;
  
  四、after和before触发器的区别:
  1、after是先完成数据的增删改,再触发,触发的语句晚于监视的增删改操作,无法影响前面的增删改动作。
  2、before是先完成触发,再增删改,触发的语句先于监视的增删改。
  例1:对于上面的trigerbeforeInsertOrder这个触发器,因为同时要对orders表的create_time字段赋值。
  对字段create_time的赋值操作要早于insert,因此使用before触发器。
  注意:如果此时使用after触发器会报Updating of new row is not allowed in after trigger 错误。
  例2:爆仓业务的检查即客户购买某个商品,购买商品的数量如果超过库存数量则购买数量为库存数量,同时商品表的库存数量自动改变。
  create trigger triggerBeforeInsertOrder before insert on orders for each row
  begin
  declare kcNum int;
  select num into kcNum from goods where gid=new.gid;
  if new.much>kcNum then
  set new.much=kuNum;
  end if;
  update goods set num=num-new.much where gid=new.gid;
  end;
  注意:如果此时使用after触发器会报Updating of new row is not allowed in after trigger 错误。
  五、触发器引用行变量
  下图一目了然地描述了触发器的行变量new和old。
DSC0000.jpg

DSC0001.jpg




运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-613522-1-1.html 上篇帖子: 实现MYSQL的主从复制 下篇帖子: mysql基础四 存储过程
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表