跳到主要内容

SQL 行级触发器

介绍

SQL触发器是一种特殊的存储过程,它在数据库中的特定事件(如插入、更新或删除)发生时自动执行。行级触发器(Row-Level Trigger)是触发器的一种,它会在每一行数据受到影响时触发。与语句级触发器(Statement-Level Trigger)不同,行级触发器会在每一行数据上执行一次,而不是在整个SQL语句执行完毕后执行一次。

行级触发器通常用于需要在数据变更时执行复杂逻辑的场景,例如数据验证、审计日志记录或自动计算字段值。

行级触发器的语法

行级触发器的基本语法如下:

sql
CREATE TRIGGER trigger_name
BEFORE | AFTER | INSTEAD OF
INSERT | UPDATE | DELETE
ON table_name
FOR EACH ROW
BEGIN
-- 触发器逻辑
END;
  • trigger_name:触发器的名称。
  • BEFORE | AFTER | INSTEAD OF:指定触发器在事件之前、之后或替代事件执行。
  • INSERT | UPDATE | DELETE:指定触发器在插入、更新或删除操作时触发。
  • table_name:触发器所属的表。
  • FOR EACH ROW:表示这是一个行级触发器。
  • BEGIN ... END:触发器的主体,包含触发器执行的逻辑。

代码示例

假设我们有一个名为 employees 的表,其中包含员工的工资信息。我们希望在每次更新员工的工资时,自动记录工资变更的历史记录。

首先,我们创建一个 salary_history 表来存储工资变更记录:

sql
CREATE TABLE salary_history (
employee_id INT,
old_salary DECIMAL(10, 2),
new_salary DECIMAL(10, 2),
change_date TIMESTAMP
);

接下来,我们创建一个行级触发器,在 employees 表的 salary 字段更新时,将旧工资和新工资记录到 salary_history 表中:

sql
CREATE TRIGGER log_salary_change
AFTER UPDATE
ON employees
FOR EACH ROW
BEGIN
IF OLD.salary <> NEW.salary THEN
INSERT INTO salary_history (employee_id, old_salary, new_salary, change_date)
VALUES (OLD.employee_id, OLD.salary, NEW.salary, NOW());
END IF;
END;

在这个触发器中,OLD.salary 表示更新前的工资,NEW.salary 表示更新后的工资。如果工资发生变化,触发器会将变更记录插入到 salary_history 表中。

实际案例

假设我们有以下 employees 表的数据:

employee_idnamesalary
1Alice5000
2Bob6000

当我们执行以下更新语句时:

sql
UPDATE employees
SET salary = 5500
WHERE employee_id = 1;

触发器会自动将以下记录插入到 salary_history 表中:

employee_idold_salarynew_salarychange_date
1500055002023-10-01 12:00:00

总结

行级触发器是SQL中强大的工具,可以在每一行数据发生变化时执行自定义逻辑。它们常用于数据验证、审计日志记录和自动计算字段值等场景。通过本文的介绍和示例,你应该对行级触发器的基本概念和用法有了初步的了解。

附加资源与练习

  1. 练习:尝试在 employees 表上创建一个触发器,当删除员工记录时,自动将删除的员工信息记录到一个 deleted_employees 表中。
  2. 进一步学习:了解语句级触发器与行级触发器的区别,并思考在什么情况下应该使用哪种触发器。
  3. 参考文档:查阅你所使用的数据库管理系统(如MySQL、PostgreSQL等)的官方文档,了解更多关于触发器的详细语法和高级用法。
提示

在实际开发中,触发器的使用需要谨慎,因为它们可能会对数据库性能产生影响。确保在必要时使用触发器,并对其进行充分的测试。