您的位置:首页 > 数据库 > MySQL

MySQL系列(十一):触发器

2018-04-04 00:00 281 查看
一般不到万不得已不会使用触发器。

一、简介

触发器(trigger),事先为某张表绑定好一段代码,当表中的某些内容发生改变的时候(增删改)系统会自动触发代码,并且执行。

一张表中只能拥有一种触发时间的一种类型的触发器,最多一张表能有6个触发器

触发器是一个特殊的存储过程,它是MySQL在insert、update、delete的时候自动执行的代码块

触发器必须定义在特定的表上

自动执行,不能直接调用

作用:监视某种情况并触发某种操作。

触发器的思路:

监视order表,如果order表里面有增删改的操作,则自动触发goods里面里面增删该的操作。

比如新添加一个订单,则goods表就自动减少对应商品的库存。

比如取消一个订单,则goods表,就自动增加对应商品的库存减少的库存。

二、触发器四要素



事件类型:增删改,三种类型insert,delete和update

触发时间:前后,before和after

触发对象:表中的每一条记录(行)

三、创建触发器

语法:

delimiter 自定义符号 -- 临时修改语句结束符

create trigger 触发器名 触发时间 事件类型 on 表名 for each row

begin

-- 触发器的内容,每行内容都必须使用语句结束符: 分号

end

自定义符号 -- 语句结束符

delimiter ; -- 将临时修改修正过来

如果触发器内部只有一条要执行的SQL指令,可以省略begin和end。

-- 触发器:生成一个订单对应商品库存减少
delimiter $$
create trigger after_order after insert on order for each row
begin
update goods set inv = inv - 1 where id = 2;
end
$$
delimiter ;


四、查看触发器

-- 查看所有触发器或者模糊匹配
show triggers [like 'pattern'];

-- 可以查看触发器创建语句
show create trigger 触发器名字;

-- 所有的触发器都会保存一张表中: information_schema.triggers
select * from information_schema.triggers;


五、修改与删除触发器

触发器不能修改,只能先删除,后新增。

drop trigger 触发器名;

-- 删除触发器
drop trigger after_order;


六、触发器记录

不管触发器是否触发了,只要当某种操作准备执行,系统就会将当前要操作的记录的当前状态和即将执行之后新的状态给分别保留下来,供触发器使用。其中,要操作的当前状态保存到old中,操作之后的可能形态保存给new。

old代表的是旧记录,new代表的是新记录

删除的时候是没有new的,插入的时候是没有old

old和new都是代表记录本身,任何一条记录除了有数据,还有字段名字

使用方式:

old.字段名 / new.字段名(new代表的是假设发生之后的结果)

七、before与after

after是先完成数据的增删改,再触发,触发器中的语句晚于监视的增删改,无法影响前面的增删该动作。就类似于先吃饭,再付钱。

before是先完成触发,再增删改,触发的语句先于监视的增删改发生,我们有机会判断修改即将发生的操作。就类似于先付钱,再吃饭。

案例:对于已下的订单,如果订单的数量>5,就认为是恶意订单,强制把所定的商品数量改成5。

分析:

监视地点:order表

监视事件:order表的insert操作

触发时间:order表的insert操作之前。

触发事件:如果购买数量大于5,把购买数量改成5。

delimiter $

create trigger trigger_1 before insert on order for each row
begin
if new.much > 5 then
set new.much=5;
end if;
end$

delimiter ;


八、例子

案例1:购买ID为2的商品时,减少1个库存。

分析:

监视地点:order表

监视事件:order表的inset操作

触发时间:order表的inset之后

触发事件:goods表减少库存的操作

create trigger t1
after insert on order
for each row
begin
update goods set goods_number=goods_number-1 where id=2;
end$

案例2:取消订单时,减掉的库存要添加回来。

分析:

监视地点: order表

监视事件: order表的delete操作

触发时间: order表的delete操作之后

触发事件: goods表,把减掉的库存恢复过来。

create trigger t2
after delete on order
for each row
begin
update goods set goods_number=goods_number+old.much where id=old.goods_id;
end$

对应order表,删除的行我们使用old来表示,如果要引用里面的数据,则使用old.列名来表示。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  mysql mysql触发器