MySQL系列(十一):触发器

一般不到万不得已不会使用触发器。

一、简介

触发器(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.列名来表示。

转载于:https://my.oschina.net/programs/blog/1789634

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值