mysql触发器使用

在 MySQL 中,触发器(Trigger)是在对表进行特定操作时自动执行的一段代码。触发器会在执行 INSERTUPDATEDELETE 操作时,根据你定义的触发时机和条件触发。

MySQL 触发器可以在以下三种事件之一上触发:

1. 触发事件

  • INSERT:在插入新记录时触发。
  • UPDATE:在更新已有记录时触发。
  • DELETE:在删除记录时触发。

2. 触发时机

触发器的执行时机有两个:

  • BEFORE:在执行 INSERTUPDATE 或 DELETE 操作之前触发。它允许你在数据被提交到数据库之前对数据进行修改或验证。例如,你可以在 BEFORE INSERT 触发器中修改即将插入的数据。
  • AFTER:在执行 INSERTUPDATE 或 DELETE 操作之后触发。它适用于需要在数据变动后进行某些操作的场景。例如,记录日志或更新其他表的数据。

3. 触发器的触发时机总结

  • BEFORE INSERT:在插入数据之前触发。
  • AFTER INSERT:在插入数据之后触发。
  • BEFORE UPDATE:在更新数据之前触发。
  • AFTER UPDATE:在更新数据之后触发。
  • BEFORE DELETE:在删除数据之前触发。
  • AFTER DELETE:在删除数据之后触发。

4. 触发器的执行流程

  • BEFORE 触发器:如果定义了 BEFORE 触发器,触发器会在数据库执行实际的 INSERTUPDATE 或 DELETE 操作之前执行。你可以在触发器内修改即将插入、更新或删除的数据。如果修改了数据,修改后的数据将被实际执行。
  • AFTER 触发器AFTER 触发器在数据库执行实际的 INSERTUPDATE 或 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 提供了强大的数据自动化处理能力,可以在特定操作发生时自动执行预定义的操作。

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: