Bootstrap

Mysql数据库-触发器(超详细,附图,进阶必看!!)

本文章将基于黑马程序员的 "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)参数解析

  1. BEFORE/AFTER可选参数,因为刚才提到对于触发器它可以在增删改操作之前或之后触发。那么这时就需要在创建触发器时就去指定触发的时机,如果是之前就选before,如果是之后就选after。并且可以指定触发器的类型:INSERT/UPDATE/DELETE。
  2. for each row代表行级触发器,刚才也提到对于mysql数据库来说目前只支持行级触发器,所以这段参数是必须要加上的。
  3. BEGINEND中间就需要去编写触发器里面的具体逻辑实现。
  4. 可选参数schema_name代表数据库名称,也就是说在这里可以去删除指定数据库下的触发器。

三、业务示例

在这里插入图片描述
下面给予了日志表的建表语句及所需要涉及到的字段:
在这里插入图片描述
operate_time操作时间指的是触发器执行时的当前时间;operate_id操作的ID指的是我们操作的原始记录id为多少(操作的是目标表的哪一条数据,数据的id是多少);operate_params操作参数指的是插入数据时里面每一个参数是多少,更新数据时更新前后的数据是什么,删除数据时删除的是什么数据。

(1)INSERT

在这里插入图片描述
在这里插入图片描述

  1. 因为id字段是主键自增的,所以填null;operation字段则根据当前执行的操作类型进行填写(insert/update/delete);operation_time操作时间则直接通过now函数获取当前时间;要想知道当前操作数据的id是多少,因为我们是往表中插入数据,需要去获取到这段数据的id,而它的id又是在数据插入到表格之后根据主键自增自动生成的,那么就需要借助new去获取到新插入数据在表中的id;在operation_params操作参数处需要填写我们执行插入操作时传递的全部数据,那么我们可以通过concat字符串拼接的形式来记录当前插入的全部数据。
  2. 触发器在数据库中是不会被展示出来的,只能借助查询指令来查询当前数据库中的全部触发器,他们监控了哪些表哪些操作,以及它们内部的执行逻辑等等各项信息。
  3. 查看数据库的全部触发器,发现已经创建成功
    在这里插入图片描述
  4. 插入数据到表格进行测试
    在这里插入图片描述
    在日志表当中出现了对应信息,说明触发器已经生效了
    在这里插入图片描述

(2)UPDATE

在这里插入图片描述
在这里插入图片描述

  1. 因为在更新时既需要记录更新前数据也需要记录更新后数据,那么在操作参数一处需要进行改造。通过old参数就能获取到更新前的数据信息。
  2. 执行该段代码,并再次查询全部触发器,就能找到我们新创建的触发器
    在这里插入图片描述
  3. 执行一段update语句来进行测试
    在这里插入图片描述
    发现日志当中成功记录且表当中数据也已经成功修改
    在这里插入图片描述在这里插入图片描述
  4. 此时改变update语句的执行条件
    在这里插入图片描述
    它将会对表中前五条记录都进行修改
    在这里插入图片描述
    而需要关注的是:执行这一条语句,该触发器会执行五次。因为这是一个行级触发器,update影响了多少行,它就会触发多少次。
    日志中也多了五条记录:
    在这里插入图片描述

(3)DELETE

在这里插入图片描述
在这里插入图片描述

  1. 对于删除操作来说,删除之前数据是存在的,而删除之后数据就不存在了,但是new参数用于获取数据变更后的变量,所以操作id处应该改用old参数,也就是获取到数据被删除之前的变量。
  2. 查询数据库中的触发器,发现已经成功创建
    在这里插入图片描述
  3. 执行delete语句进行测试
    在这里插入图片描述
    发现表中数据被成功删除,而且在日志中已经成功保存记录
    在这里插入图片描述
;