新网站快速排名软件,衡阳购物网站开发案例,网站用什么框架,php网站开发教程培训本文转自huangjianxiang1875的http://blog.csdn.net/huangjianxiang1875/article/details/7885130 触发器#xff1a; 我们可以监视某表的变化#xff0c;当发生某种变化时#xff0c;触发某个操作 能监视#xff1a;增#xff0c;删#xff0c;改 触发操作#xff1a;增…本文转自huangjianxiang1875的http://blog.csdn.net/huangjianxiang1875/article/details/7885130 触发器 我们可以监视某表的变化当发生某种变化时触发某个操作 能监视增删改 触发操作增删改 触发器应用场景 1.当向一张表中添加或删除记录时需要在相关表中进行同步操作。 比如当一个订单产生时,订单所购的商品的库存量相应减少。 2.当表上某列数据的值与其他表中的数据有联系时。 比如当某客户进行欠款消费 可以在生成订单时通过设计触发器判断该客户的累计欠款是否超出了最大限度。 3.当需要对某张表进行跟踪时。 比如当有新订单产生时需要及时通知相关人员进行处理 此时可以在订单表上设计添加触发器加以实现
案例如下 例一、 增加一个订单 库存相对减少 使用触发器解决问题
create table g( id int, name varchar(10), num int )charset utf8; create table o( oid int, gid int, much int )charset utf8; insert into g values (1,猪,22), (2,羊,19), (3,狗,12), (4,猫,8); g表查询结果如图1 通过触发器 监视地点o表 监视操作insert 触发操作update 触发时间after 创建触发器的语法 create trigger triggerName after/before insert/update/delete on表名 for each row #这句话是固定的 begin sql语句 # 一句或多句insert/update/delete范围内 end; delimiter $ 告诉服务器以什么符号结束 默认是一“;”结束 这里是以“$”结束 create trigger tg1 after insert on o for each row begin update g set num num - 3 where id 2; #这里必须用“;”但是mysql遇见;结束 所以说要修改结束符 end$ 告诉触发器以什么符号结束 这里是$结束 这个触发器不够完美 修改有局限性 然后操作触发器 insert into o values (2,2,3)$ 此时g表查询结果如图2 删除触发器的语法 drop trigger 触发器名;drop trigger tg1; 如何在触发器引用行的值 对于insert而言新增的行 用new来表示 行中的每一列的值用 new.列名 表示 create trigger tg2 after insert on o for each row begin update g set num num - new.much where id new.gid; end$ 没有操作之前的g表信息如图3 操作触发器 insert into o values (1,4,2); 此时如图4 可见触发器已经起作用 例二、 删除一个订单库存相应增加 监视地点o表 监视事件delete 触发事件update 触发时间after 对于delete而言原本有一行后来被删除 想引用被删除的这一行用old来表示old.列名 就可以引用被删除行中的值 create trigger tg3 after delete on o for each row begin update g set num num old.much where id old.gid; end$ 没有触发之前 g表信息如图5 o表信息如图6 操作触发器 delete from o where oid 1$ 此时g表信息如图7 例三、 修改订单的数量改变库存的触发器 对于update来说 被修改的行 修改前的数据用old来表示old.列名 引用被修改之前行中的值 修改后的数据用new来表示new.列名 引用被修改之后行中的值 create trigger tg4 after update on o for each row begin update g set num num old.much - new.much where id old.gid; end$ 修改前g表的数据如图8 o表的数据如图9 操作触发器后 update o set much 7 where oid 1;
g表的数据如图10 o表的数据如图11 触发器里after和before的区别 after是先安完成数据的增删改再触发 触发的语句晚于监视的增删改无法影响前面的增删改动作 before是先完成触发再增删改 触发的语句先于监视的增删改发生我们有机会判断修改即将发生的操作 典型案例 对于所下订单进行判断如果订单的数量5就认为是恶意订单 强制把所订的商品数量改成5 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$ 查看g表的所有数据 如图1 查看o表的所有数据 如图2 触发触发器 insert into o values (1,1,100)$ 此时查看g表的所有数据 如图3 查看o表的所有数据 如图4 此时可以看出用before可以判断 查看所有的触发器 show triggers; 特别注意使用触发器要修改结束符“;”一般修改成“$” delimiter $ 这个语句结束不能加;否则认为是$;结束