在 MySQL 中,触发器(Trigger)是在对表进行特定操作时自动执行的一段代码。触发器会在执行 INSERT
、UPDATE
或 DELETE
操作时,根据你定义的触发时机和条件触发。
MySQL 触发器可以在以下三种事件之一上触发:
1. 触发事件:
- INSERT:在插入新记录时触发。
- UPDATE:在更新已有记录时触发。
- DELETE:在删除记录时触发。
2. 触发时机:
触发器的执行时机有两个:
- BEFORE:在执行
INSERT
、UPDATE
或DELETE
操作之前触发。它允许你在数据被提交到数据库之前对数据进行修改或验证。例如,你可以在BEFORE INSERT
触发器中修改即将插入的数据。 - AFTER:在执行
INSERT
、UPDATE
或DELETE
操作之后触发。它适用于需要在数据变动后进行某些操作的场景。例如,记录日志或更新其他表的数据。
3. 触发器的触发时机总结:
- BEFORE INSERT:在插入数据之前触发。
- AFTER INSERT:在插入数据之后触发。
- BEFORE UPDATE:在更新数据之前触发。
- AFTER UPDATE:在更新数据之后触发。
- BEFORE DELETE:在删除数据之前触发。
- AFTER DELETE:在删除数据之后触发。
4. 触发器的执行流程:
- BEFORE 触发器:如果定义了
BEFORE
触发器,触发器会在数据库执行实际的INSERT
、UPDATE
或DELETE
操作之前执行。你可以在触发器内修改即将插入、更新或删除的数据。如果修改了数据,修改后的数据将被实际执行。 - AFTER 触发器:
AFTER
触发器在数据库执行实际的INSERT
、UPDATE
或DELETE
操作之后执行。你不能修改已提交的数据,但可以执行其他任务,如日志记录、同步其他表等。
5. 触发器的触发顺序:
- 如果同一事件上有多个触发器,MySQL 会按照触发器创建的顺序来执行它们(对于
BEFORE
触发器,按创建顺序执行;对于AFTER
触发器,同样按创建顺序执行)。
示例:
BEFORE INSERT 触发器:
sqlCopy Code
CREATE TRIGGER before_insert_example
BEFORE INSERT ON employees
FOR EACH ROW
BEGIN
-- 在插入数据前检查某个条件
IF NEW.salary < 1000 THEN
SET NEW.salary = 1000; -- 如果工资小于1000,自动调整为1000
END IF;
END;
这个触发器在向 employees
表插入新记录之前执行,如果插入的 salary
小于 1000,则自动将其调整为 1000。
AFTER UPDATE 触发器:
sqlCopy Code
CREATE TRIGGER after_update_example
AFTER UPDATE ON employees
FOR EACH ROW
BEGIN
-- 在更新记录后,记录日志
INSERT INTO employee_logs (employee_id, old_salary, new_salary, update_time)
VALUES (OLD.employee_id, OLD.salary, NEW.salary, NOW());
END;
这个触发器在 employees
表的记录被更新后执行,记录一条日志,保存员工的旧薪资和新薪资。
总结:
触发器的触发时机和事件包括:
- BEFORE INSERT/UPDATE/DELETE:在数据库操作之前执行。
- AFTER INSERT/UPDATE/DELETE:在数据库操作之后执行。 触发器为 MySQL 提供了强大的数据自动化处理能力,可以在特定操作发生时自动执行预定义的操作。