触发器概述

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

触发器的创建

创建触发器语法

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

说明:

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

    代码举例

    ```sql //1. 创建数据表 CREATE TABLE test_trigger ( id INT PRIMARY KEY AUTO_INCREMENT, t_note VARCHAR(30) );

CREATE TABLE test_trigger_log ( id INT PRIMARY KEY AUTO_INCREMENT, t_log VARCHAR(30) );

//2. 创建触发器 DELIMITER // CREATE TRIGGER before_insert BEFORE INSERT ON test_trigger FOR EACH ROW BEGIN INSERT INTO test_trigger_log (t_log) VALUES(‘before_insert’); END // DELIMITER ;

//3. 向test_trigger数据表中插入数据 INSERT INTO test_trigger (t_note) VALUES (‘测试 BEFORE INSERT 触发器’);

//4. 创建触发器 DELIMITER // CREATE TRIGGER after_insert AFTER INSERT ON test_trigger FOR EACH ROW BEGIN INSERT INTO test_trigger_log (t_log) VALUES(‘after_insert’); END // DELIMITER ;

//5. 向test_trigger数据表中插入数据 INSERT INTO test_trigger (t_note) VALUES (‘测试 AFTER INSERT 触发器’);

查看test_trigger_log数据表中的数据<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/12692524/1652319944468-fb74d8f1-5b13-4050-821a-3eb1e9b5c38e.png#clientId=ucdc2e6f2-2abf-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=161&id=ubebb5d12&margin=%5Bobject%20Object%5D&name=image.png&originHeight=241&originWidth=864&originalType=binary&ratio=1&rotation=0&showTitle=false&size=24039&status=done&style=none&taskId=u983cea21-62e2-4568-8185-8f31106eb3f&title=&width=576)
```sql
//定义触发器"salary_check_trigger", 基于员工表"employee"的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\G

//方式二:查看当前数据库中某个触发器的定义
SHOW CREATE TRIGGER 触发器名;

//方式三:从系统库information_schema的TRIGGERS表中查询
SELECT * FROM information_schema.TRIGGERS;

删除触发器

DROP TRIGGER IF EXISTS 触发器名;

触发器的优缺点

优点

  • 触发器可以确保数据的完整性
  • 触发器可以帮助我们记录操作日志
  • 触发器还可以用在操作数据前,对数据进行合法性检查

    缺点

  • 可读性差

  • 相关数据的更新,可能会导致触发器出错

    注意点

    如果在子表中定义了外键约束,并且外键指定了ON UPDATA / DELETE CASCADE / SET NULL子句,此时修改父表被引用的键值或删除父表被引用的记录行时,也会引起子表的修改和删除操作,但是此时基于子表的UPDATE和DELETE语句定义的触发器并不会被激活,只有直接对子表执行操作语句时才会激活触发器