本文章将基于黑马程序员的 "Mysql数据库从入门到精通"教程 的视图部分进行归纳总结,如有侵权请联系删除!!
【MySQL触发器实战秘籍!让数据库自动替你打工】还在手动维护数据一致性?深度剖析触发器(Trigger)工作原理,从创建到实战一网打尽!详解INSERT/UPDATE/DELETE事件监听,搭配BEFORE/AFTER时机控制,轻松实现审计日志、数据同步与业务规则强校验!
一、触发器介绍
他的关键字是触发,它可以在我们的表结构发生插入、更新或删除数据操作的之前或之后触发。
OLD用于引用原来的记录内容,NEW用于引用新的记录内容。
假设我们执行了一条update语句,它影响了五行数据,那么这时该触发器会被触发五次,这就称之为行级触发器;而假设我们执行一条update语句,不管这条语句影响了多少行数据,但是触发器只触发一次,这就称之为语句集触发器。
也就是说在对表中进行数据的增删改时,就要触发相应的触发器,然后把变更日志记录在日志表当中。
二、触发器语法
//创建触发器
create trigger trigger_name
before/after insert/update/delete on table_name for each row
begin
--SQL逻辑;
end;
//查看全部触发器
show trigger;
//删除指定触发器
drop trigger [schema_name.]trigger_name;
(1)参数解析
- BEFORE/AFTER可选参数,因为刚才提到对于触发器它可以在增删改操作之前或之后触发。那么这时就需要在创建触发器时就去指定触发的时机,如果是之前就选before,如果是之后就选after。并且可以指定触发器的类型:INSERT/UPDATE/DELETE。
- for each row代表行级触发器,刚才也提到对于mysql数据库来说目前只支持行级触发器,所以这段参数是必须要加上的。
- 在BEGIN与END中间就需要去编写触发器里面的具体逻辑实现。
- 可选参数schema_name代表数据库名称,也就是说在这里可以去删除指定数据库下的触发器。
三、业务示例
下面给予了日志表的建表语句及所需要涉及到的字段:
operate_time操作时间指的是触发器执行时的当前时间;operate_id操作的ID指的是我们操作的原始记录id为多少(操作的是目标表的哪一条数据,数据的id是多少);operate_params操作参数指的是插入数据时里面每一个参数是多少,更新数据时更新前后的数据是什么,删除数据时删除的是什么数据。
(1)INSERT
- 因为id字段是主键自增的,所以填null;operation字段则根据当前执行的操作类型进行填写(insert/update/delete);operation_time操作时间则直接通过now函数获取当前时间;要想知道当前操作数据的id是多少,因为我们是往表中插入数据,需要去获取到这段数据的id,而它的id又是在数据插入到表格之后根据主键自增自动生成的,那么就需要借助new去获取到新插入数据在表中的id;在operation_params操作参数处需要填写我们执行插入操作时传递的全部数据,那么我们可以通过concat字符串拼接的形式来记录当前插入的全部数据。
- 触发器在数据库中是不会被展示出来的,只能借助查询指令来查询当前数据库中的全部触发器,他们监控了哪些表哪些操作,以及它们内部的执行逻辑等等各项信息。
- 查看数据库的全部触发器,发现已经创建成功
- 插入数据到表格进行测试
在日志表当中出现了对应信息,说明触发器已经生效了
(2)UPDATE
- 因为在更新时既需要记录更新前数据也需要记录更新后数据,那么在操作参数一处需要进行改造。通过old参数就能获取到更新前的数据信息。
- 执行该段代码,并再次查询全部触发器,就能找到我们新创建的触发器
- 执行一段update语句来进行测试
发现日志当中成功记录且表当中数据也已经成功修改
- 此时改变update语句的执行条件
它将会对表中前五条记录都进行修改
而需要关注的是:执行这一条语句,该触发器会执行五次。因为这是一个行级触发器,update影响了多少行,它就会触发多少次。
日志中也多了五条记录:
(3)DELETE
- 对于删除操作来说,删除之前数据是存在的,而删除之后数据就不存在了,但是new参数用于获取数据变更后的变量,所以操作id处应该改用old参数,也就是获取到数据被删除之前的变量。
- 查询数据库中的触发器,发现已经成功创建
- 执行delete语句进行测试
发现表中数据被成功删除,而且在日志中已经成功保存记录