触发器概述

MySQL 从 5.0.2 版本开始支持触发器。MySQL 的触发器和存储过程一样,都是嵌入到 MySQL 服务器的一段程序。

触发器是由 事件来触发 某个操作,这些事件包括 INSERTUPDATEDELETE 事件。所谓事件就是指用户的动作或者触发某项行为。如果定义了触发程序,当数据库执行这些语句时候,就相当于事件发生了,就会 自动 激发触发器执行相应的操作。

当对数据表中的数据执行插入、更新和删除操作,需要自动执行一些数据库逻辑时,可以使用触发器来实现。

触发器的创建

创建触发器语法

创建触发器的语法结构是:

CREATE TRIGGER 触发器名称
{BEFORE|AFTER} {INSERT|UPDATE|DELETE} ON 表名
FOR EACH ROW 触发器执行的语句块;

说明:

  • 表名:表示触发器监控的对象。
  • BEFORE|AFTER:表示触发的时间。BEFORE 表示在事件之前触发;AFTER 表示在事件之后触发。
  • INSERT|UPDATE|DELETE:表示触发的事件。
  • 触发器执行的语句块 :可以是单条 SQL 语句,也可以是由 BEGIN…END 结构组成的复合语句块。

代码举例

定义触发器“salary_check_trigger”,基于员工表“employees”的 INSERT 事件,在 INSERT 之前检查将要添加的新员工薪资是否大于他领导的薪资,如果大于领导薪资,则报 sqlstate_value 为’HY000’的错误,从而使得添加失败。

DELIMITER //
 
CREATE TRIGGER salary_check_trigger
BEFORE INSERT ON employees FOR EACH ROW
BEGIN
	DECLARE mgrsalary DOUBLE;
	SELECT salary INTO mgrsalary FROM employees WHERE employee_id = NEW.manager_id;
 
	IF NEW.salary > mgrsalary THEN
		SIGNAL SQLSTATE 'HY000' SET MESSAGE_TEXT = '薪资高于领导薪资错误';
	END IF;
END //
 
DELIMITER ;

上面触发器声明过程中的 NEW 关键字代表 INSERT 添加语句的新记录。

查看、删除触发器

查看触发器

SHOW TRIGGERS;
SHOW CREATE TRIGGER 触发器名;
SELECT * FROM information_schema.TRIGGERS;

删除触发器

触发器也是数据库对象,删除触发器也用 DROP 语句,语法格式如下:

DROP TRIGGER [IF EXISTS] 触发器名称;

触发器的优缺点

优点

1、触发器可以确保数据的完整性

2、触发器可以帮助我们记录操作日志。

3、触发器还可以用在操作数据前,对数据进行合法性检查。

缺点

1、触发器最大的一个问题就是可读性差,开发人员添加数据时不一定知道有触发器,从而可能出现触发器错误

2、相关数据的变更,可能会导致触发器出错。

注意点

子表设置外键约束 & ON UPDATE/DELETE CASCADE/SET NULL 约束条件时,那么对父表进行 UPDATE/DELETE 时,从表也会进行 UPDATE/DELETE ,但是并不会触发子表 UPDATE/DELETE 触发器