触发器(数据库必学)

概念

触发器是一种特殊类型的存储过程,它不同于存储过程,主要是通过事件触发而被执行的。而存储过程则需要主动调用其名字执行

注意

  1. 在 MySQL 5 中,触发器名必须在每个表中唯一,但不是在每个数据库中唯一,即同一数据库中的两个表可能具有相同名字的触发器
  2. 每个表的每个事件每次只允许一个触发器,因此,每个表最多支持 6 个触发器,before/after insert、before/after delete、before/after update

优缺点

优点

可以保证数据安全,并进行安全校验

缺点

过分依赖触发器,影响数据库的结构,增加数据库的维护成本

语法

delimiter 自定义结束符号 

create trigger 触发器名字 触发时间 触发事件 onfor each row 

begin-- 触发器内容主体,每行用分号结尾 

end 

自定义的结束符合 

delimiter ;

参数说明

1、触发器时间

当 SQL 指令发生时,会令行中数据发生变化,而每张表中对应的行有两种状态:数据操作前和操作后

  • before:表中数据发生改变前的状态
  • after:表中数据发生改变后的状态

2、触发事件

触发器是针对数据发送改变才会被触发,对应的操作只有

  • INSERT
  • DELETE
  • UPDATE

查看触发器

1、查看全部

show triggers;

2、查看单个

show create trigger 触发器名称;

删除触发器

drop trigger 触发器名称;

实例

如果订单表发生数据插入,对应的商品库存应该减少

在这里插入图片描述
在这里插入图片描述

实际应用

上述数据是写死的,并不灵活,因为无论购买多少商品,始终 - 1

触发器针对的是数据库中的每一行记录,每行数据在操作前后都会有一个对应的状态,触发器将没有操作之前的状态保存到 old 关键字中,将操作后的状态保存到 new 中

注意

old 和 new 不是所有触发器都有

在这里插入图片描述

重新编辑

在这里插入图片描述
在这里插入图片描述

此时的new.goods_num是是orders表里面的goods_num,goods_id同理

拓展

当然我们还需要考虑一种情况:如果此时商品的库存不够了,该怎么处理?

解决:在 insert 之前查询库存,若不够就暴力解决

在这里插入图片描述
在这里插入图片描述

在此:如果在触发器中出现错误,那么前面的已经执行的操作也会全部清空

不能对同一张表进行修改

在这里插入图片描述
在这里插入图片描述

  • 5
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值