概念
触发器是一种特殊类型的存储过程,它不同于存储过程,主要是通过事件触发而被执行的。而存储过程则需要主动调用其名字执行
注意
- 在 MySQL 5 中,触发器名必须在每个表中唯一,但不是在每个数据库中唯一,即同一数据库中的两个表可能具有相同名字的触发器
- 每个表的每个事件每次只允许一个触发器,因此,每个表最多支持 6 个触发器,before/after insert、before/after delete、before/after update
优缺点
优点
可以保证数据安全,并进行安全校验
缺点
过分依赖触发器,影响数据库的结构,增加数据库的维护成本
语法
delimiter 自定义结束符号
create trigger 触发器名字 触发时间 触发事件 on 表 for 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 之前查询库存,若不够就暴力解决
在此:如果在触发器中出现错误,那么前面的已经执行的操作也会全部清空
不能对同一张表进行修改