触发器(Trigger)是数据库中的一种特殊的存储过程,它在特定事件发生时自动执行。触发器通常用于实现复杂的业务逻辑、数据审核、日志记录和数据完整性约束。触发器可以在以下事件发生时触发:
- 插入(INSERT)
- 更新(UPDATE)
- 删除(DELETE)
触发器的优点
- 自动化操作:触发器可以自动执行指定的操作,减少手动干预。
- 维护数据完整性:可以在数据插入、更新或删除时自动检查约束条件,确保数据一致性。
- 审计和日志记录:可以记录数据变化的历史,方便审计和追溯。
- 实现复杂业务规则:可以实现复杂的业务逻辑,将其封装在触发器中。
创建触发器
使用 CREATE TRIGGER
语句可以创建触发器。触发器的定义包括触发时间(BEFORE 或 AFTER)、触发事件(INSERT、UPDATE 或 DELETE)和触发操作。
语法
CREATE TRIGGER trigger_name
{BEFORE | AFTER} {INSERT | UPDATE | DELETE}
ON table_name
FOR EACH ROW
BEGIN
-- 触发器逻辑
END;
示例代码
假设我们有一个 employees
表,我们将创建一个触发器,在插入新记录时自动记录操作到一个 audit_log
表中。
-- 创建数据库
CREATE DATABASE company;
-- 选择数据库
USE company;
-- 创建 employees 表
CREATE TABLE employees (
emp_id INT AUTO_INCREMENT PRIMARY KEY,
emp_name VARCHAR(100) NOT NULL,
emp_position VARCHAR(100),
emp_salary DECIMAL(10, 2),
hire_date DATE
);
-- 创建 audit_log 表
CREATE TABLE audit_log (
log_id INT AUTO_INCREMENT PRIMARY KEY,
action VARCHAR(100),
emp_id INT,
emp_name VARCHAR(100),
action_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 创建触发器,在插入新记录到 employees 表时记录到 audit_log
DELIMITER //
CREATE TRIGGER after_employee_insert
AFTER INSERT ON employees
FOR EACH ROW
BEGIN
INSERT INTO audit_log (action, emp_id, emp_name)
VALUES ('INSERT', NEW.emp_id, NEW.emp_name);
END;
//
DELIMITER ;
使用触发器
当向 employees
表插入新记录时,触发器会自动向 audit_log
表插入一条日志记录。
示例代码
-- 插入新员工记录
INSERT INTO employees (emp_name, emp_position, emp_salary, hire_date)
VALUES ('John Doe', 'Manager', 75000.00, '2023-10-01');
-- 查询 audit_log 表中的日志记录
SELECT * FROM audit_log;
结果:
log_id | action | emp_id | emp_name | action_time
-------|--------|--------|----------|---------------------
1 | INSERT | 1 | John Doe | 2023-10-01 12:34:56
删除触发器
使用 DROP TRIGGER
语句可以删除触发器。
语法
DROP TRIGGER trigger_name;
示例代码
-- 删除触发器 after_employee_insert
DROP TRIGGER after_employee_insert;
触发器示例:实现复杂业务逻辑
假设我们需要在员工薪水更新时记录旧薪水和新薪水,我们可以创建一个触发器来实现这一需求。
-- 创建 salary_change_log 表
CREATE TABLE salary_change_log (
log_id INT AUTO_INCREMENT PRIMARY KEY,
emp_id INT,
old_salary DECIMAL(10, 2),
new_salary DECIMAL(10, 2),
change_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 创建触发器,在更新员工薪水时记录薪水变化
DELIMITER //
CREATE TRIGGER before_employee_update
BEFORE UPDATE ON employees
FOR EACH ROW
BEGIN
IF OLD.emp_salary <> NEW.emp_salary THEN
INSERT INTO salary_change_log (emp_id, old_salary, new_salary)
VALUES (OLD.emp_id, OLD.emp_salary, NEW.emp_salary);
END IF;
END;
//
DELIMITER ;
示例代码
-- 更新员工薪水
UPDATE employees
SET emp_salary = 80000.00
WHERE emp_id = 1;
-- 查询 salary_change_log 表中的薪水变化记录
SELECT * FROM salary_change_log;
结果:
log_id | emp_id | old_salary | new_salary | change_time
-------|--------|------------|------------|---------------------
1 | 1 | 75000.00 | 80000.00 | 2023-10-01 12:45:23
小结
通过以上代码示例,展示了如何在 MySQL 中创建、使用和删除触发器。触发器是强大的工具,可以帮助自动化操作、维护数据完整性、记录审计日志和实现复杂的业务逻辑。