触发器

image
image
image
image
image
image
以下以 MySQL 数据库为例,分别创建语句级触发器和行级触发器,并展示执行结果。假设我们有两个表,一个是 Employees 员工表,用于存储员工信息;另一个是 EmployeeAudit 审计表,用于记录员工信息的变动情况。

表结构定义

-- 创建员工表
CREATE TABLE Employees (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(50),
    salary DECIMAL(10, 2)
);

-- 创建审计表
CREATE TABLE EmployeeAudit (
    audit_id INT PRIMARY KEY AUTO_INCREMENT,
    employee_id INT,
    change_type VARCHAR(20),
    change_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

1. 语句级触发器示例

假设我们希望在每次对 Employees 表执行 UPDATE 操作后,在 EmployeeAudit 审计表中插入一条记录,记录此次更新操作。

-- 创建语句级触发器
DELIMITER //
CREATE TRIGGER after_employees_update_statement
AFTER UPDATE ON Employees
FOR EACH STATEMENT
BEGIN
    INSERT INTO EmployeeAudit (employee_id, change_type)
    VALUES (NULL, 'UPDATE_ALL');
END //
DELIMITER ;

插入测试数据

INSERT INTO Employees (name, salary) VALUES ('Alice', 5000.00);
INSERT INTO Employees (name, salary) VALUES ('Bob', 6000.00);

执行 UPDATE 语句并查看结果

-- 执行更新操作
UPDATE Employees SET salary = salary * 1.1 WHERE salary < 6000;

-- 查看审计表
SELECT * FROM EmployeeAudit;

执行结果:EmployeeAudit 表中会插入一条记录,因为不管 UPDATE 语句影响了多少行数据,语句级触发器只执行一次。

2. 行级触发器示例

我们还是在 Employees 表上创建触发器,当 Employees 表中的员工薪资发生更新时,在 EmployeeAudit 审计表中针对每一条被更新的员工记录插入一条变动记录。

-- 创建行级触发器
DELIMITER //
CREATE TRIGGER after_employees_update_row
AFTER UPDATE ON Employees
FOR EACH ROW
BEGIN
    IF NEW.salary != OLD.salary THEN
        INSERT INTO EmployeeAudit (employee_id, change_type)
        VALUES (OLD.id, 'UPDATE_SALARY');
    END IF;
END //
DELIMITER ;

再次执行 UPDATE 语句并查看结果

-- 执行更新操作
UPDATE Employees SET salary = salary * 1.1 WHERE salary < 6000;

-- 查看审计表
SELECT * FROM EmployeeAudit;

执行结果:假设上一次更新影响了 1 行数据,审计表中只有 1 条记录;而这次如果 UPDATE 语句影响了 2 行数据 ,EmployeeAudit 表中会插入两条记录,因为行级触发器针对每一条受影响的行都会执行一次。
image
image
image
image
知识补充:
增量数据(Delta Data)
指的是自上次处理或检查后,数据库中发生变化的数据,包括新增、修改、删除的数据。比如在数据仓库场景中,每天可能只需要抽取源数据库中当天新增或修改的记录(即增量数据)来更新数据仓库,而不是重新抽取全部数据,这样能大幅减少数据传输和处理量,提升效率。像基于时间戳来标识数据变化,通过对比时间戳筛选出增量数据。

image
image
image

posted @ 2025-07-09 20:01  cirl'  阅读(15)  评论(0)    收藏  举报