~ 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;
