什么是MySQL中的触发器?

MySQL中的触发器是指在 insert、update 或 delete 操作之前或之后,触发并执行的特殊存储过程。

触发器的语法格式:

sql
CREATE TRIGGER trigger_name 
{BEFORE | AFTER} 
{INSERT | UPDATE | DELETE} 
ON table_name 
FOR EACH ROW 
trigger_body;
  • trigger_name:触发器名称。
  • BEFORE/AFTER:触发事件之前或之后执行。
  • INSERT/UPDATE/DELETE:对应的操作事件。
  • table_name:触发器关联的表名。
  • FOR EACH ROW:对表中的每一行执行触发器。(可以省略,默认为行级触发器)
  • trigger_body:触发器要执行的SQL语句。

例1:在用户表users上创建一个AFTER INSERT触发器,在插入新行后,向日志表logs中插入一条日志记录。

sql
CREATE TABLE users (
    id INT PRIMARY KEY,
    name VARCHAR(20)
);

CREATE TABLE logs (
    id INT PRIMARY KEY AUTO_INCREMENT,
    user_id INT, 
    operation VARCHAR(20), 
    oper_time DATETIME 
);

DELIMITER $$ 
CREATE TRIGGER after_insert_users 
    AFTER INSERT ON users 
    FOR EACH ROW 
BEGIN
    INSERT INTO logs(user_id, operation, oper_time) 
    VALUES(NEW.id, 'INSERT', NOW());
END$$
DELIMITER ;

NEW代表新插入行的值。

测试:

sql
INSERT INTO users VALUES(1, 'John');
查看logs表:
id  user_id  operation   oper_time
1       1     INSERT  2020-04-01 12:23:01

可以看到,在users表中插入新行后,自动在logs表中添加了一条日志记录。

触发器的主要作用:

  1. 预防非法数据进入数据库。可以在INSERT/UPDATE前校验数据。
  2. 自动记录修改数据的日志。
  3. 维护自动更新的字段。比如更新时间等。
  4. 使得MySQL具有业务逻辑处理能力。