触发器

触发器介绍

触发器是与表有关的数据库对象,指在 insert/update/delete 之前(BEFORE)或之后(AFTER),触发并执行触发器中定义的 SQL 语句集合。

语法

触发器的语法包括触发器的创建、查看以及删除。

创建触发器:

CREATE TRIGGER trigger_name
    BEFORE/AFTER trigger_event
    ON tbl_name FOR EACH ROW -- 行级触发器
BEGIN
    trigger_stmt ;
END;

说明:

  • trigger_name 为触发器的名称,应遵循命名约定 [trigger time]_[table name]_[trigger event],例如 before_employees_update
  • BEFORE/AFTER 为触发激活时间,如果想在事件执行之前触发,就使用 BEFORE,否则就使用 AFTER
  • trigger_event 为触发事件,可以是 INSERTUPDATEDELETE
  • 触发器必须与特定表关联。没有表触发器将不存在,所以必须在 ON 关键字之后指定表名;
  • BEGINEND 之间定义定义触发器逻辑。

查看触发器:

SHOW TRIGGERS;

删除触发器:

DROP TRIGGER [schema_name.] trigger_name; -- 如果没有指定 schema_name,默认为当前数据库 。

例子

通过触发器记录 tb_user 表的数据变更日志,将变更日志添加到日志表 user_logs 中,以更新为例。

tb_user 表结构如下:

tb_user.png

先创建 user_logs 表,结构如下:

t_user_logs.png

接下来创建一个 BEFORE UPDATE 触发器,该触发器在对 tb_user 表中的行记录更改之前被调用。

CREATE DEFINER=`root`@`localhost` TRIGGER `before_user_update` BEFORE UPDATE ON `tb_user` FOR EACH ROW BEGIN
    INSERT INTO 
        tb_users_logs(`operation` ,`operate_time` ,`operate_id` ,`operate_params` ) 
    VALUES('update',NOW(),new.id,CONCAT('[update] ','更新前的数据:name=',old.name,',age=',old.age,',gender=',old.gender,' | 更新后的数据:name=',new.name,',age=',new.age,',gender=',new.gender));
END

我们把章北海的年龄修改为 37 岁,tb_users_logs 表里就多了一条数据,记录了修改前和修改后的数据,结果如下:

before_user_update.png

before_user_update 触发器的触发逻辑中有些陌生的东西:

'update',NOW(),NEW.id,CONCAT('[update] ','更新前的数据:name=',old.name,',age=',old.age,',gender=',old.gender,' | 更新后的数据:name=',new.name,',age=',new.age,',gender=',new.gender)

在这段语句中,new.idold.nameold.ageold.gendernew.namenew.agenew.gender 代表什么意思呢?“.”后面的内容好理解,就是 tb_user 表的字段,但是“.”前面的 newold 分别代表什么含义呢?

在触发器主体中,可以用 old 来访问 tb_user 表更新之前的数据,例如 old.age 访问的就是 tb_user 表更新之前 age 字段的值,为 35;new 则是用来访问tb_user 表更新之后的数据,例如 new.age 访问的就是 tb_user 表更新之后 age 字段的值,为 37,即:

  • old 访问触发前的数据;
  • new 访问触发后的数据。

当然并不是所有的触发事件都可以用 newold 访问触发前的数据或触发后的数据。例如 insert 触发事件,在添加数据前都没有对应数据,就不可能用 old 去访问触发前的数据,所以 insert 触发事件只能用 new 访问触发后的数据。以下是三种触发事件的 newold 说明:

触发器类型NEW和OLD
INSERTNEW 表示将要或者已经新增的数据
UPDATEOLD 表示修改之前的数据 , NEW 表示将要或已经修改后的数据
DELETEOLD 表示将要或者已经删除的数据

作用

  • 确保数据的完整性;
  • 日志记录;
  • 数据校验。

参考

  1. MySQL触发器创建
  2. 六种触发器案例详解

征途漫漫

28 声望
0 粉丝
0 条评论
推荐阅读
二分查找法学习记录
二分查找二分查找算法本身不难,这一章的重点不在二分查找算法本身,而是如何写出正确的代码。关键字:清晰、严谨定义不同的循环不变量,或者不一样的函数语义都会导致代码不一样。二分查找法的两种实现方式定义...

Moonshadow2333阅读 234

初学后端,如何做好表结构设计?
这篇文章介绍了设计数据库表结构应该考虑的4个方面,还有优雅设计的6个原则,举了一个例子分享了我的设计思路,为了提高性能我们也要从多方面考虑缓存问题。

王中阳Go4阅读 1.7k评论 2

封面图
Vue+Express+Mysql全栈项目之增删改查、分页排序导出表格功能
本文记录一下实现一个全栈项目,前端使用vue框架、后端使用express框架、数据库使用mysql。此项目的意义不仅仅有助于我们复习nodejs相关知识、更有助于带前端新人,使其快速从整体全局角度中,理解常规后台管理系...

水冗水孚4阅读 2.6k

MySQL百万数据深度分页优化思路分析
一般在项目开发中会有很多的统计数据需要进行上报分析,一般在分析过后会在后台展示出来给运营和产品进行分页查看,最常见的一种就是根据日期进行筛选。这种统计数据随着时间的推移数据量会慢慢的变大,达到百万...

一个程序员的成长7阅读 904

封面图
深入理解MySQL索引底层数据结构
在日常工作中,我们会遇见一些慢SQL,在分析这些慢SQL时,我们通常会看下SQL的执行计划,验证SQL执行过程中有没有走索引。通常我们会调整一些查询条件,增加必要的索引,SQL执行效率就会提升几个数量级。我们有没...

京东云开发者3阅读 588

封面图
Laravel入门及实践,快速上手ThinkSNS+二次开发
【摘要】自从ThinkSNS+不使用ThinkPHP框架而使用Laravel框架之后,很多人都说技术门槛抬高了,其实你与TS+的距离仅仅只是学习一个新框架而已,所以,我们今天来说说Laravel的入门。

ThinkSNS1阅读 2.4k

一文了解MySQL中的多版本并发控制
作者:京东零售  李泽阳最近在阅读《认知觉醒》这本书,里面有句话非常打动我:通过自己的语言,用最简单的话把一件事情讲清楚,最好让外行人也能听懂。也许这就是大道至简,只是我们习惯了烦琐和复杂。希望借助...

京东云开发者2阅读 510

封面图

征途漫漫

28 声望
0 粉丝
宣传栏