触发器是一类特殊的事务 ,可以监视某种数据操作(insert/update/delete),并触发相关操作(insert/update/delete)。
看以下事件:
完成下单与减少库存的逻辑
Insert into o (gid,num) values (2,3); // 插入语句
Update g set goods_num = goods_num - 3 where id = 2;// 更新过程
这两个逻辑可以看成一个整体 , 或者说 , insert ---> 引来 update
用触发器可以解决上述问题 .
我们可以监视某表的变化 , 当发生某种变化时 , 触发某个操作 .
创建触发器的语法
Create trigger triggerName
After/before insert/update/delete on 表名
For each row # 这句话是固定的
Begin
Sql 语句 ; # 一句或多句 ,insert/update/delete 范围内
End;
删除触发器的语法 :
Drop trigger 触发器名
查看触发器
Show triggers
如何在触发器引用行的值
对于 insert 而言 , 新增的行 用 new 来表示 ,
行中的每一列的值 , 用 new . 列名 来表示 .
对于 delete 来说 , 原本有一行 , 后来被删除 ,
想引用被删除的这一行 , 用 old, 来表示 , old. 列名 , 就可以引用被删行中的值 .
对于 update 来说 ,
被修改的行 ,
修改前的数据 , 用 old 来表示 , old. 列名 引用被修改之前行中的值
修改后的数据 , 用 new 来表示 , new. 列名 引用被修改之后行中的值
触发器里 after 和 before 的区别
After 是先完成数据的增 , 删 , 改再触发 ,
触发的语句晚于监视的增 , 删 , 改 , 无法影响前面的增删改动作 .
Before 是先完成触发 , 再增删改 ,
触发的语句先于监视的增 , 删 , 改发生 , 我们有机会判断 , 修改即将发生的操作 .
典型案例 :
对于所下订单 , 进行判断 , 如果订单的数量 > 5 , 就认为是恶意订单 ,
强制把所订的商品数量改成 5
查看哪些触发器: