共计 2546 个字符,预计需要花费 7 分钟才能阅读完成。
1 引言
本文是对 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 总结
在某些时候,触发器可以起到锦上添花的作用,但是,触发器的效率并不高,所以还是尽量少用。
: