触发器介绍

触发器是与表有关的数据库对象,指在 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. 六种触发器案例详解

Moonshadow2333
28 声望0 粉丝

征途漫漫


« 上一篇
存储过程