触发器概述
MySQL 从 5.0.2 版本开始支持触发器。MySQL 的触发器和存储过程一样,都是嵌入到 MySQL 服务器的一段程序。
触发器是由 事件来触发 某个操作,这些事件包括 INSERT、UPDATE、DELETE 事件。所谓事件就是指用户的动作或者触发某项行为。如果定义了触发程序,当数据库执行这些语句时候,就相当于事件发生了,就会 自动 激发触发器执行相应的操作。
当对数据表中的数据执行插入、更新和删除操作,需要自动执行一些数据库逻辑时,可以使用触发器来实现。
触发器的创建
创建触发器语法
创建触发器的语法结构是:
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 触发器。