触发器
来源:互联网 发布:php测试链接ftp服务器 编辑:程序博客网 时间:2024/06/06 21:03
1).作用
监视某种情况并触发某种操作 观察以下场景:一个电子城商城 商品表,g +--------------+--------------+--------------+ | 主键 | 商品名字 | 库存 | +--------------+--------------+--------------+ | 1 | 电脑 | 28 | +--------------+--------------+--------------+ | 2 | 自行车 | 12 | +--------------+--------------+--------------+ 订单表,o +--------------+--------------+--------------+ | 订单主键 | 商品外键 | 购买数量 | +--------------+--------------+--------------+ | 1 | 2 | 3 | +--------------+--------------+--------------+ | 2 | 1 | 5 | +--------------+--------------+--------------+ 完成订单减少库存的逻辑 insert into o (gid,num) values (2,3),//插入语句 Update g set goods num = goods num - 3 where id = 2;//跟新过程 这俩个逻辑可以看成一个整体,或者说,insert--->引来update 我们可以监视某表的变化,当发生某种变化时触发某个操作
2).触发器的定义
能监视:增,删,改 触发操作:增,删,改
3).触发器的四要素
监视地点:table 监视事件:insert/update/delete 触发时间:after/before 触发事件:insert/update/delete
4).触发器的创建语法
Create trigger triggerName After/before insert/update/delete on 表名 For each row #这句话是固定的 Begin Sql语句:#一句或多句,insert/update/delete 范围内 End -->删除触发器的语法 Drop trigger 触发器名 -->修改结束语句的符号 delimiter $
5).创建简单触发器
①:增加一个订单,库存相应减小 #监视地点 o 表 #监视事件 insert #触发事件 update #触发时间 after ---对于insert而言,新增的行用new来表示,行中的每一列的值,用new.列名来表示。 create trigger tg1 after insert on o for each row begin update g set num = num - new.much where id = new.gid; end$ ②:删除一个订单,库存相应增加 #监视地点 o 表 #监视事件 delete #触发事件 update #触发时间 after ---对于delete来说,原本有一行,后来被删除,想要引用被删除的这一行,old来表示,old.列名,就可以引用被删除列中的值 create trigger gt2 after delete on o for each row begin update g set num = num + old.much where id = old.gid; end$ ③:修改一个订单,库存相应改变 #监视地点 o 表 #监视事件 update #触发事件 update #触发时间 after ---被修改的数据用old来表示,old.列名引用被修改之前行中的值 ---修改之后的数据,用new来表示,new.列名引用被修改之后行中的值 create trigger tg3 after update on o for each row begin update g set num = num + old.much - new.much where id = old.gid; end$ -->当修改订单时候修改商品名称的时候代码应该 需要知道一个每个update语句的触发器只需要一个,所以我们尽量用下面这个触发器 create trigger tg4 after update on o for each row begin update g set num = num + old.much where id = old.gid; update g set num = num - new.much where id = new.gid; end$
6).before与after的区别
After: 是先完成数据的增、删、改再触发。 触发的语句晚于监视的增、删、改。并且无法影响前面的增、删、改动作。before:是先完成触发 再增、删、改。 触发的语句先于监视的增、删、改发生。我们有机会判断、修改即将要发生的操作。假 设 : 假设商品表有商品2,数量是10; 我们往订单表插入一条记录: insert into o -> values -> (1,2,20)$ select * from o$ +------+------+------+ | oid | gid | much | +------+------+------+ | 1 | 2 | 20 | +------+------+------+ 会发现商品1的数量变为-10了。这就是问题的所在,因为我们之前创建的触发器是after,也就是说触发的语句是在插入订单记录之 后才执行的,这样我们就无法判断新插入订单的购买数量。 select * from g$ +------+------+------+ | id | name | num | +------+------+------+ | 1 | 猪 | 22 | | 2 | 羊 | -10 | | 3 | 狗 | 12 | | 4 | 猫 | 48 | +------+------+------+典型案例: -->我们用一个典型案例来区分它们的区别,新建一个触发器: -->对于所下订单进行判断,如果订单的数目大于5,就认为是恶意订单,强制把所订的商品数量改为5 #监视地点: 商品表o #监视事件:insert #触发时间:before #触发事件:update 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$ 执行完,把之前创建的after触发器删掉,再来插入一条订单记录: drop trigger tg1$ insert into o -> values -> (1,2,20)$ select * from o$ +------+------+------+ | oid | gid | much | +------+------+------+ | 1 | 2 | 5 | +------+------+------+ select * from g$ +------+------+------+ | id | name | num | +------+------+------+ | 1 | 猪 | 22 | | 2 | 羊 | 5 | | 3 | 狗 | 13 | | 4 | 猫 | 48 | +------+------+------+ --执行完会发现订单记录的数量变为5,商品2的数量变为5了,就不会出现负数了。
阅读全文
0 0
- 触发器
- 触发器
- 触发器
- 触发器
- 触发器
- 触发器
- 触发器
- 触发器
- 触发器
- 触发器
- 触发器
- 触发器
- 触发器
- 触发器
- 触发器
- 触发器
- 触发器
- 触发器
- 中国式直播行业出海:机会OR陷阱?
- LAMP架构及Mysql-5.6二进制免编译安装
- 导航条(参照冒险岛官网)12.12
- Java Swing 多种组件完美界面实例(代码+截图)
- JavaScript 闭包
- 触发器
- ListView滑动置顶,listview吸顶效果,安卓时间栏状态栏透明,有图有源码
- Golang从入门到精通(八):Golang数组
- 八周二次课(12月12日) 14.6 多进程Manager 14.7 进程池
- 雕刻机蓝牙android上位机控制器设计
- 算法系列—— 输出所有的笛卡尔积组合
- linux基本操作---shell脚本-变量、表达式、日期
- 一看就懂的,java深拷贝浅拷贝
- 用ajax实现图片上传 帮你简单快速学会使用