美文网首页
mysql触发器

mysql触发器

作者: 小石读史 | 来源:发表于2020-04-17 08:07 被阅读0次

1、触发器的概念

触发器(trigger)是MySQL提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作(insert,delete, update)时就会激活它执行。——百度百科

通俗的将就是:你执行一条sql语句,这条sql语句的执行会自动去触发执行其他的sql语句

2、触发器创建语法四要素:

 1.监视地点(table)

 2.监视事件(insert/update/delete)

 3.触发时间(after/before)

 4.触发事件(insert/update/delete)

触发器预发如下:

trigger_time是触发器的触发事件,可以为before(在检查约束前触发)或after(在检查约束后触发);trigger_event是触发器的触发事件,包括insert、update和delete,需注意对同一个表相同触发时间的相同触发事件,只能定义一个触发器;可以使用old和new来引用触发器中发生变化的记录内容。

因为mysql的执行结束标识默认是“,”,所以我们创建触发器时需要先将mysql的结束标识符改为其他的字符,一般都选用$或者$$,sql如下:

delimiter $ //设置MySQL执行结束标志,默认为;

注意:DELIMITER只能在命令行使用,不能在编辑器上使用

(1)在触发目标上执行insert操作后会有一个新行,如果在触发事件中需要用到这个新行的变量,可以用new关键字表示 

(2)在触发目标上执行delete操作后会有一个旧行,如果在触发事件中需要用到这个旧行的变量,可以用old关键字表示 

(3)在触发目标上执行update操作后原纪录是旧行,新记录是新行,可以使用new和old关键字来分别操作

3、查看和删除已有的触发器

(1)查看已有触发器:show triggers 

(2)删除已有触发器:drop trigger triggerName

4、创建使用触发器案例

首先先创建一张表

create table goods_info(

  gid int,

  name varchar(20),

  num int

);

create table order_info(

  oid int,

  gid int,

  gname varchar(20),

  num int

);

insert into goods_info values(1,'aaaaa',10);

insert into goods_info values(2,'bbbbb',20);

insert into goods_info values(3,'ccccc',30);

delimiter //

注意:DELIMITER只能在命令行使用,不能在编辑器上使用

案例一:当下单时减少相应的货品的库存,创建触发器:

create trigger updateGoodsNumWhenOrd

after

insert

on order_info

for each row

begin

update goods_info set num=num-new.nums where gid=new.gid;

end //

当执行:INSERT INTO `test`.`order_info`(`oid`, `gid`, `gname`, `nums`) VALUES (1, 1, 'aaa', 2);时goods_info 表中的数量就会减去订单中的商品数量。

goods_info表结果如图:

案例二:删除订单时增加商品的库存为订单中的库存:

create trigger updateGoodsNumWhenDelOrd

after

delete

on order_info

for each row

begin

update goods_info set num=num+old.nums where gid=old.gid;

end//

执行:delete from order_info where oid = 1;

goods_info表结果如图:

案例三:更新订单中商品的数量时更新商品表商品库存

create trigger updateGoodsNumWhenUpdateOrd

before

update

on order_info

for each row

begin

update goods_info set num=num+old.nums-new.nums where gid = new.gid;

end//

先执行订单插入操作;INSERT INTO `test`.`order_info`(`oid`, `gid`, `gname`, `nums`) VALUES (2, 1, 'aaa', 2);

再执行更新操作:UPDATE `order_info` SET `nums` = 7 WHERE `oid` = 2 ;

goods_info表结果如图:

相关文章

网友评论

      本文标题:mysql触发器

      本文链接:https://www.haomeiwen.com/subject/pjzrmhtx.html