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表中添加了一条日志记录。
触发器的主要作用:
- 预防非法数据进入数据库。可以在INSERT/UPDATE前校验数据。
- 自动记录修改数据的日志。
- 维护自动更新的字段。比如更新时间等。
- 使得MySQL具有业务逻辑处理能力。