MySQL系列(十一):触发器
2018-04-04 00:00
281 查看
一般不到万不得已不会使用触发器。
一张表中只能拥有一种触发时间的一种类型的触发器,最多一张表能有6个触发器
触发器是一个特殊的存储过程,它是MySQL在insert、update、delete的时候自动执行的代码块
触发器必须定义在特定的表上
自动执行,不能直接调用
作用:监视某种情况并触发某种操作。
触发器的思路:
监视order表,如果order表里面有增删改的操作,则自动触发goods里面里面增删该的操作。
比如新添加一个订单,则goods表就自动减少对应商品的库存。
比如取消一个订单,则goods表,就自动增加对应商品的库存减少的库存。
事件类型:增删改,三种类型insert,delete和update
触发时间:前后,before和after
触发对象:表中的每一条记录(行)
delimiter 自定义符号 -- 临时修改语句结束符
create trigger 触发器名 触发时间 事件类型 on 表名 for each row
begin
-- 触发器的内容,每行内容都必须使用语句结束符: 分号
end
自定义符号 -- 语句结束符
delimiter ; -- 将临时修改修正过来
如果触发器内部只有一条要执行的SQL指令,可以省略begin和end。
drop trigger 触发器名;
old代表的是旧记录,new代表的是新记录
删除的时候是没有new的,插入的时候是没有old
old和new都是代表记录本身,任何一条记录除了有数据,还有字段名字
使用方式:
old.字段名 / new.字段名(new代表的是假设发生之后的结果)
before是先完成触发,再增删改,触发的语句先于监视的增删改发生,我们有机会判断修改即将发生的操作。就类似于先付钱,再吃饭。
案例:对于已下的订单,如果订单的数量>5,就认为是恶意订单,强制把所定的商品数量改成5。
分析:
监视地点:order表
监视事件:order表的insert操作
触发时间:order表的insert操作之前。
触发事件:如果购买数量大于5,把购买数量改成5。
分析:
监视地点:order表
监视事件:order表的inset操作
触发时间:order表的inset之后
触发事件:goods表减少库存的操作
案例2:取消订单时,减掉的库存要添加回来。
分析:
监视地点: order表
监视事件: order表的delete操作
触发时间: order表的delete操作之后
触发事件: goods表,把减掉的库存恢复过来。
对应order表,删除的行我们使用old来表示,如果要引用里面的数据,则使用old.列名来表示。
一、简介
触发器(trigger),事先为某张表绑定好一段代码,当表中的某些内容发生改变的时候(增删改)系统会自动触发代码,并且执行。一张表中只能拥有一种触发时间的一种类型的触发器,最多一张表能有6个触发器
触发器是一个特殊的存储过程,它是MySQL在insert、update、delete的时候自动执行的代码块
触发器必须定义在特定的表上
自动执行,不能直接调用
作用:监视某种情况并触发某种操作。
触发器的思路:
监视order表,如果order表里面有增删改的操作,则自动触发goods里面里面增删该的操作。
比如新添加一个订单,则goods表就自动减少对应商品的库存。
比如取消一个订单,则goods表,就自动增加对应商品的库存减少的库存。
二、触发器四要素
事件类型:增删改,三种类型insert,delete和update
触发时间:前后,before和after
触发对象:表中的每一条记录(行)
三、创建触发器
语法:delimiter 自定义符号 -- 临时修改语句结束符
create trigger 触发器名 触发时间 事件类型 on 表名 for each row
begin
-- 触发器的内容,每行内容都必须使用语句结束符: 分号
end
自定义符号 -- 语句结束符
delimiter ; -- 将临时修改修正过来
如果触发器内部只有一条要执行的SQL指令,可以省略begin和end。
-- 触发器:生成一个订单对应商品库存减少 delimiter $$ create trigger after_order after insert on order for each row begin update goods set inv = inv - 1 where id = 2; end $$ delimiter ;
四、查看触发器
-- 查看所有触发器或者模糊匹配 show triggers [like 'pattern']; -- 可以查看触发器创建语句 show create trigger 触发器名字; -- 所有的触发器都会保存一张表中: information_schema.triggers select * from information_schema.triggers;
五、修改与删除触发器
触发器不能修改,只能先删除,后新增。drop trigger 触发器名;
-- 删除触发器 drop trigger after_order;
六、触发器记录
不管触发器是否触发了,只要当某种操作准备执行,系统就会将当前要操作的记录的当前状态和即将执行之后新的状态给分别保留下来,供触发器使用。其中,要操作的当前状态保存到old中,操作之后的可能形态保存给new。old代表的是旧记录,new代表的是新记录
删除的时候是没有new的,插入的时候是没有old
old和new都是代表记录本身,任何一条记录除了有数据,还有字段名字
使用方式:
old.字段名 / new.字段名(new代表的是假设发生之后的结果)
七、before与after
after是先完成数据的增删改,再触发,触发器中的语句晚于监视的增删改,无法影响前面的增删该动作。就类似于先吃饭,再付钱。before是先完成触发,再增删改,触发的语句先于监视的增删改发生,我们有机会判断修改即将发生的操作。就类似于先付钱,再吃饭。
案例:对于已下的订单,如果订单的数量>5,就认为是恶意订单,强制把所定的商品数量改成5。
分析:
监视地点:order表
监视事件:order表的insert操作
触发时间:order表的insert操作之前。
触发事件:如果购买数量大于5,把购买数量改成5。
delimiter $ create trigger trigger_1 before insert on order for each row begin if new.much > 5 then set new.much=5; end if; end$ delimiter ;
八、例子
案例1:购买ID为2的商品时,减少1个库存。分析:
监视地点:order表
监视事件:order表的inset操作
触发时间:order表的inset之后
触发事件:goods表减少库存的操作
create trigger t1 after insert on order for each row begin update goods set goods_number=goods_number-1 where id=2; end$
案例2:取消订单时,减掉的库存要添加回来。
分析:
监视地点: order表
监视事件: order表的delete操作
触发时间: order表的delete操作之后
触发事件: goods表,把减掉的库存恢复过来。
create trigger t2 after delete on order for each row begin update goods set goods_number=goods_number+old.much where id=old.goods_id; end$
对应order表,删除的行我们使用old来表示,如果要引用里面的数据,则使用old.列名来表示。
相关文章推荐
- [MySQL FAQ]系列 -- 如何利用触发器实现账户权限审计
- MySQL 系列(三)你不知道的 视图、触发器、存储过程、函数、事务、索引、语句
- MySQL 系列(三)你不知道的 视图、触发器、存储过程、函数、事务、索引、语句
- mysql系列:触发器使用
- Mysql系列课程--第七章 触发器和存储过程
- MySQL(十一)之触发器
- **MYSQL** 系列十一
- MySQL 系列(三)你不知道的 视图、触发器、存储过程、函数、事务、索引、语句
- [MySQL FAQ]系列 -- 如何利用触发器实现账户权限审计
- MySQL---数据库从入门走向大神系列(十一)-Java获取数据库/结果集的元信息、将数据表写入excel表格
- Mysql系列(十一)异常处理
- MySQL学习系列11:触发器
- ElasticStack系列之十一 & 同步 mysql 数据的实践与思考
- 【转】MYSQL入门学习之十一:触发器的基本操作
- mysql 开发基础系列19 触发器
- MySQL学习系列之触发器
- MySQL常用函数系列之十一:流程函数(2)
- Mysql-学习笔记(==》触发器 十一)
- 8Python全栈之路系列之MySQL触发器
- PHP系列(十一)PHP操作mysql(i)数据库