### mysql之触发器before和after的区别
我们先做个测试:接上篇日志建的商品表g和订单表o和触发器。
假设:假设商品表有商品1,数量是10;我们往订单表插入一条记录:
~~~
insert into o(gid,much) values(1,20);
~~~
就会发现商品1的数量变为-10了。这就是问题的所在,因为我们之前创建的触发器是after,也就是说触发的语句是在插入订单记录之后才执行的,这样我们就无法判断新插入订单的购买数量是否超过了实际的库存总量了。
先讲一下after和before的区别:
after是先完成数据的增删改,再触发,触发的语句晚于监视的增删改操作,无法影响前面的增删改动作;也就是说先插入订单记录,再更新商品的数量;
before是先完成触发逻辑之后,再增删改,所触发的语句先于所监视的增删改,这样我们就有机会判断,修改即将发生的增删改操作逻辑;
用一个典型案例来区分它们的区别,新建一个触发器:
~~~
#监视地点: 商品表o
#监视事件:insert
#触发时间:before
#触发事件:update
~~~
案例:当新增一条订单记录时,判断订单的商品数量,如果数量大于10,就默认改为10
~~~
create trigger tg6
before insert on o
for each row
begin
if new.much > 10 then
set new.much = 10;
end if;
update g set num = num - new.much where id = new.gid;
end$
~~~
执行完,把之前创建的after触发器删掉,再来插入一条订单记录:
~~~
insert into o(gid,much) valus(1,20)$
~~~
执行完会发现订单记录的数量变为10,商品1的数量变为0了,就不会出现负数了。
- 授权管理
- 角色管理
- 设置密码
- 5.6 版本
- 系统用户
- 当前用户
- 目录
- 设计规划
- 数据字典
- 状态监控
- 查看MYSQL表占用空间状态
- show table status
- SHOW 命令
- SHOW TABLE STATUS
- 表格输出
- 调优
- 书籍培训
- 数据库管理员的第一本书(原书第2版)
- 视频
- 收获,不止SQL优化
- 基本概念
- 工具
- phpMyadmin
- 变更管理
- 数据关系与原则
- 数据完整性
- 业务完整性
- 字段更新(1)
- 订单应用(1)
- 订单应用(2)
- 表间数据连接
- 数据管理
- Cheet Sheet
- Database Administrator
- 索引设计
- Mysql 四种常见的索引
- MySQL索引之主键索引
- MySQL索引使用对查询、插入速度的影响
- 查询优化
- 存储优化
- 分割数据表字段
- Procedure_Analyse优化表结构
- 性能优化
- 拆分DELETE/INSERT语句
- MySQL命令
- 表复制
- 如何快速创建相同结构的表
- 主键设计
- 为什么推荐InnoDB引擎使用自增主键?
- INFORMATION_SCHEMA
- _5.6版本
- USER_PRIVILEGES