在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
本文实例讲述了MySQL触发器概念、原理与用法。分享给大家供大家参考,具体如下: 1、触发器的概念
上面是百度给的触发器的概念,我理解的触发器的概念,就是你执行一条sql语句,这条sql语句的执行会自动去触发执行其他的sql语句,就这么简单。 超简说明:sql1->触发->sqlN,一条sql触发多个sql 2、触发器创建的四个要素 (1)监视地点(table) 3、创建触发器 需求:在下订单的时候,对应的商品的库存量要相应的减少,即买几个商品就减少多少个库存量。 订单表:ord 首先来创建表并添加几条数据: create table goods( gid int, name varchar(20), num smallint ); create table ord( oid int, gid int, much smallint ); insert into goods values(1,'cat',40); insert into goods values(2,'dog',63); insert into goods values(3,'pig',87); 然后按照触发器创建的四个要素来进行分析:
最后创建触发器: create trigger t1 after insert on ord for each row begin update goods set num=num-2 where gid = 1; end$ 分析:触发器的名称为t1,触发时间为after,监视动作为insert,监视ord表,for each row最后在进行讨论,这里先记住就行了,begin和end之间写触发事件,这里是一个update语句。意思是不论我下什么订单,都会把商品编号为1的商品的库存量减去2个。 注意:先不要运行上面的代码,因为mysql的执行结束标识默认是;。如果运行以上的sql语句,mysql碰到;时会自动停止执行,然后end语句就执行不到了。所以我们需要先将mysql的结束标识符改为其他的字符,一般都选用$或者$$,这里选用$来作为执行的结束标识。使用下面的语句来修改MySQL执行的结束标识。 delimiter $ //设置MySQL执行结束标志,默认为; 4、查看和删除已有的触发器 (1)查看已有触发器: 5、触发器中引用行变量 (1)在触发目标上执行insert操作后会有一个新行,如果在触发事件中需要用到这个新行的变量,可以用new关键字表示 当下订单时减少相应的货品的库存量,创建触发器: create trigger t2 after insert on ord for each row begin update goods set num=num-new.much where gid=new.gid; end$ 当删除订单时增加相应的修改货品的库存量,创建触发器: create trigger t3 after delete on ord for each row begin update goods set num=num+old.much where gid=old.gid; end$ 当更新订单的购买数修改相应的修改货品的库存量,创建触发器: create trigger t4 before update on ord for each row begin update goods set num=num+old.much-new.much where gid = new.gid; end$ 6、after和before的区别 after操作,是在执行了监视动作后,才会执行触发事件
创建触发器: create trigger t5 before insert on ord for each row begin declare restNum int; select num into restNum from goods where gid = new.gid; if new.much > restNum then set new.much = restNum; end if; update goods set num=num-new.much where gid=new.gid; end$ 注意:这里如果使用的是after就会报错,如果使用的是after,就会先执行insert操作,也就是插入订单操作,然后在进行判断下单数量和库存量,得出新的下单数量,可是已经执行了下单操作了,所以就会报错。这里必须使用before操作。 7、for each row是干什么的? 在oracle触发器中,触发器分为行触发器和语句触发器 比如: create trigger tn after update on xxtable for each row #每一行受影响,触发事件都执行,叫做行触发器 begin sqlN; end$ 执行: update xxtable set xxx=xxx where id>100; 该修改操作假设100行,那么sqlN,会触发多少次?答案:会触发100次。 拓展: 在oracle中,for each row如果不写,无论update语句一次影响了多少行,都只执行一次触发事件。 更多关于MySQL相关内容感兴趣的读者可查看本站专题:《MySQL查询技巧大全》、《MySQL事务操作技巧汇总》、《MySQL存储过程技巧大全》、《MySQL数据库锁相关技巧汇总》及《MySQL常用函数大汇总》 希望本文所述对大家MySQL数据库计有所帮助。 |
请发表评论