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表结果如图: