本文是对 MySQL 中触发器的总结, 从触发器概念出发, 结合实例对创建触发器, 使用触发器, 删除触发器进行介绍.
2 触发器简介
MySQL 触发器和存储过程一样, 都是嵌入到 MySQL 的一段程序. 触发器是由事件来触发某个操作, 这些事件包括 INSERT,UPDATE,DELETE. 如果定义了触发器, 当数据库执行这些语句的时候就会激活触发器执行相应的操作, 触发程序是与表有关的命令数据库对象, 当表上出现特定事件, 将激活该对象.
触发器是一个特殊的存储过程, 不同的是, 执行存储过程要使用 call 语句来调用, 而触发器的执行不需要用 call 来调用, 也不需要手工启动, 只要当一个预定义的事件发生, 触发器就会被 MySQL 自动调用. 触发器可以查询其他表, 而且可以包含复杂的 SQL 语句.
3 创建触发器
(1) 创建只有一条执行语句的触发器
语法结构如下:
CREATE TRIGGER trigger_name trigger_time trigger_event ON table_name FOR EACH ROW trigger_stmt
trigger_name: 用户自定义的触发器名称;
trigger_time: 标识触发事件, 可以指定为 before(时间发生前执行) 或 after(事件发生后执行);
trigger_event: 标识触发事件, 包括 INSERT,UPDATE,DELETE;
table_name: 触发器建立在哪个表上;
trigger_stmt: 触发器执行语句.
(2) 创建有多个执行语句的触发器
语法结构如下:
- CREATE TRIGGER trigger_name trigger_time trigger_event ON table_name FOR EACH ROW
- BEGIN
语句执行列表
END
当触发器有至少一条的执行语句时, 多条执行语句需要用 BEGIN 和 END 包裹, 分别表示整个代码块的开始和结束.
为演示触发器操作, 我们先创建一下三个数据表:
- create table tb_student(
- id int PRIMARY key auto_increment,
- name varchar(10)
- );
- create table tb_before_trigger(
- id int PRIMARY key auto_increment,
- num int ,
- time_now datetime NULL DEFAULT CURRENT_TIMESTAMP
- );
- create table tb_after_trigger(
- id int PRIMARY key auto_increment,
- num int ,
- time_now datetime NULL DEFAULT CURRENT_TIMESTAMP
- );
示例 1: 创建一个名为 before_trigger 的触发器, 该触发器会在每次对表 tb_student 执行 insert 操作前触发, 触发时会往 before_trigger 表插入一条包含 tb_student 表总记录数的记录.
- delimiter //
- create trigger before_trigger before insert
- on tb_student for each row
- begin
- insert into tb_before_trigger (num) select count(*) from tb_student;
- end
- //
- delimiter ;
示例 2: 创建一个名为 after_trigger 的触发器, 该触发器会在每次对表 tb_student 执行 insert 操作前触发, 触发时会向 before_trigger 表插入一条包含 tb_student 表总记录数的记录.
- delimiter //
- create trigger after_trigger after insert
- on tb_student for each row
- begin
- insert into tb_after_trigger (num) select count(*) from tb_student;
- end
- //
- delimiter ;
来测试一下示例 1 和示例 2 中创建的触发器, 往 tb_student 表中插入一条数据 (插入前 3 个表没有任何记录):
insert into tb_student (name) values('zhangsan');
插入后, 查看三个表中数据:
tb_student 表:
tb_before_trigger 表:
tb_after_trigger 表:
可以看到, 在 tb_student 表执行 insert 操作后, 另外两个表也分别更新了记录, tb_before_trigger 表 num 值为 0, 证明在 tb_student 执行 insert 操作前插入的; tb_after_trigger 表 num 值为 1, 证明在 tb_student 执行 insert 操作后插入的 -- 这就是 before 与 after 的区别.
对于其他条件触发器, 使用方法与示例 1 和示例 2 类似, 本文不在演示.
4 查看触发器
(1)show triggers 语句
通过 show triggers 语句可以查看示例 1 和示例 2 中创建的触发器:
show triggers;
输出结果:
(2) 在 triggers 表中查看触发器
在 information_schema 数据库的 triggers 表中存放在 MySQL 数据库中的所有触发器, 可以通过查询语句进行查看:
select * from information_schema.triggers where trigger_name = 'before_trigger' ;
输出结果:
当不指定查询条件时, 即是指查看所有触发器信息.
5 删除触发器
使用 DROP TRIGGER 语句可以删除触发器, 基本语法结构如下:
DROP TRIGGER [schema_name] trigger_name
其中, schema_name 表示数据库名称, 是可选参数, 如果省略则表示从当前数据库中删除触发器.
示例 3: 删除示例 1 中创建的触发器 before_trigger
drop trigger before_trigger;
6 总结
在某些时候, 触发器可以起到锦上添花的作用, 但是, 触发器的效率并不高, 所以还是尽量少用.
来源: http://www.linuxidc.com/Linux/2018-12/155915.htm