~ MySQL 触发器

MySQL 的触发器和存储过程一样,都是嵌入到 MySQL 中的一段程序,是 MySQL 中管理数据的有力工具。

不同的是执行存储过程要使用 CALL 语句来调用,而触发器的执行不需要使用 CALL 语句来调用,也不需要手工启动,而是通过对数据表的相关操作来触发、激活,从而实现执行。

MySQL 中,通过执行 INSERT、UPDATE 和 DELETE 操作才能激活触发器,其它 SQL 语句则不会激活触发器。


为什么要使用触发器呢?在实际开发项目时,我们经常会遇到以下情况:

  • 在学生表中添加一条关于学生的记录时,学生的总数就必须同时改变
  • 删除一条数据时,需要在数据库存档表中保留一个备份副本

上述情况实现的业务逻辑不同,但是它们都需要在数据表发生更改时,自动进行一些处理,这时就可以使用触发器。


在实际使用中,MySQL 所支持的触发器有三种:INSERT 触发器、UPDATE 触发器和 DELETE 触发器。


创建触发器

在 MySQL 5.7 中,可以使用 CREATE TRIGGER 语句创建触发器。

# 基本语法

CREATE TRIGGER <触发器名> 
< BEFORE | AFTER > <INSERT | UPDATE | DELETE > 
ON <表名> FOR EACH Row<触发器主体>

(1)创建 before 类型触发器

# 准备工作:创建一个员工信息表 tb_emp8,包含 id、name、deptId 和 salary 字段
create table tb_emp8(
	e_id int(11) primary key,
	e_name varchar(22) not null,
	deptId int(11),
	salary float not null
)

# 创建一个名为 SumOfSalary 的触发器,触发条件是向表 tb_emp8 中插入数据前,对新插入的 salary 字段值求和

create trigger SumOfSalary
before insert on tb_emp8
for each row
set @sum=@sum + new.salary;

# SumOfSalary 创建完成后,向 tb_emp8 中插入记录时,定义的 sum 值由 0 变成了 1500,即 1000 和 500 的和

SET @sum=0;  // 设定初始值
insert into tb_emp8 values(1,'A',1,1000),(2,'B',1,500);  // 触发条件
select @sum;  // 查看@sum

(2)创建 after 类型触发器

# 准备工作:创建 tb_emp6 和 tb_emp7 两个员工信息表,里面包含 id、name、deptId 和 salary 字段
create table tb_emp6(
	e_id int(11) primary key,
	e_name varchar(22) not null,
	deptId int(11) not null,
	salary float not null
)

create table tb_emp7(
	e_id int(11) primary key,
	e_name varchar(22) not null,
	deptId int(11) not null,
	salary float not null
)

# 创建一个名为 double_salary 的触发器,触发的条件是向数据表 tb_emp6 中插入数据之后,再向数据表 tb_emp7 中插入相同的数据,并且 salary 为 tb_emp6 中新插入的 salary 字段值的 2 倍。

create trigger double_salary
after insert on tb_emp6
for each row
insert into tb_emp7
values (new.e_id,new.e_name,new.deptId,2*new.salary);

# 触发器 double_salary 创建完成之后,向表 tb_emp6 中插入记录时,会同时向表 tb_emp7 中插入相同的记录,并且 salary 字段为 tb_emp6 中 salary 字段值的 2 倍。

insert into tb_emp6 values (1,'A',1,100),(2,'B',1,50);

          


查看触发器

查看触发器是指查看数据库中已经存在的触发器的定义、状态和语法信息等。

MySQL 中查看触发器的方法包括: SHOW TRIGGERS 语句和查询 information_schema 数据库下的 triggers 表。


(1)show triggers 语句查看触发器信息

SHOW TRIGGERS    // SHOW TRIGGERS 语句用来查看当前创建的所有触发器的信息

因为该语句无法查询指定的触发器,所以在触发器较少的情况下,使用该语句会很方便。

如果要查看特定触发器的信息或数据库中触发器较多时,可直接从 information_schema 数据库中的 triggers 表中查找。


(2)在 triggers 表中查看触发器信息

MySQL 中,所有触发器的信息都存在 information_schema 数据库的 triggers 表中,可通过查询命令 SELECT 来查看

SELECT * FROM information_schema.triggers WHERE trigger_name= '触发器名';

由运行结果可以查看触发器的详细信息:

  • TRIGGER_SCHEMA 表示触发器所在的数据库;
  • TRIGGER_NAME 表示触发器的名称;
  • EVENT_OBJECT_TABLE 表示在哪个数据表上触发;
  • ACTION_STATEMENT 表示触发器触发的时候执行的具体操作;
  • ACTION_ORIENTATION 的值为 ROW,表示在每条记录上都触发;
  • ACTION_TIMING 表示触发的时刻是 AFTER;
  • 还有一些其他信息,比如触发器的创建时间、SQL 的模式、触发器的定义账户和字符集等。

上述 SQL 语句也可以不指定触发器名称,这样将查看所有的触发器:

SELECT * FROM information_schema.triggers

修改和删除触发器

修改触发器可以通过删除原触发器,再以相同的名称创建新的触发器。


与其他 MySQL 数据库对象一样,可以使用 DROP 语句将触发器从数据库中删除。

# 基本语法

DROP TRIGGER [ IF EXISTS ] [数据库名] <触发器名>

# 代码示例

DROP TRIGGER double_salary;