触发器: trigger 一触即发
作用:监视某种情况并触发某种操作
能监视: 增.删.改
触发操作: 增.删.改
四要素:
监视地点、监视事件、触发时间、触发事件
创建触发器的语法:
Create trigger triggerName
After/before insert/update/delete on 表名
For each row #这句话是固定的
Begin
Sql语句 #一句或多句,insert/update/delete范围内
End;
小技巧:修改结束符 delimiter $
删除触发器: Drop trigger 触发器名;
查看触发器: show triggers;
如何在触发器引用行的值
对于insert而言,新增的行 用new来表示,
行中的每一列的值,用new.列名来表示对于delete来说,原本有一行,后来被删除,
想引用被删除的这一行,用old,来表示old.列名,就可以引用被删除行中的值对于update来说,
被修改的行,
修改前的数据,用old来表示,old.列名引用被修改之前行中的值
修改后的数据,用new来表示,new.列名引用被修改之后行中的值
触发器里before和after的区别
After是先增,删,改 再触发
触发的语句晚于监视的增,删,改,无法影响前面的增删改动作Before是先触发,再增,删,改
触发的语句先于监视的增,删,改,发生,我们有机会判断,修改即将发生的操作.
应用场合:
1.当向一张表中添加或删除记录时,需要在相关表中进行同步操作。
比如,当一个订单产生时,订单所购的商品的库存量相应减少。2.当表上某列数据的值与其他表中的数据有联系时。
比如,当某客户进行欠款消费,
可以在生成订单时通过设计触发器判断该客户的累计欠款是否超出了最大限度。3.当需要对某张表进行跟踪时。
比如,当有新订单产生时,需要及时通知相关人员进行处理,
此时可以在订单表上设计添加触发器加以实现
典型案例:
对于所下订单进行判断,如果订单的数量>5,就认为是恶意订单,
强制把订单的商品数量改成5
监听地点 o表
监听事件 insert
触发事件 update
触发时间 before
目的,触发时间先于监视事件发生,并判断监视事件的数据
Create trigger tg5
before insert on o
For each row
Begin
If new.much > 5 then
Set new.much = 5;
End if;
Update g set num = num – new.much where id = new.gid;
End$