MySQL(17)什么是触发器?

触发器(Trigger)是数据库中的一种特殊的存储过程,它在特定事件发生时自动执行。触发器通常用于实现复杂的业务逻辑、数据审核、日志记录和数据完整性约束。触发器可以在以下事件发生时触发:

  • 插入(INSERT)
  • 更新(UPDATE)
  • 删除(DELETE)

触发器的优点

  1. 自动化操作:触发器可以自动执行指定的操作,减少手动干预。
  2. 维护数据完整性:可以在数据插入、更新或删除时自动检查约束条件,确保数据一致性。
  3. 审计和日志记录:可以记录数据变化的历史,方便审计和追溯。
  4. 实现复杂业务规则:可以实现复杂的业务逻辑,将其封装在触发器中。

创建触发器

使用 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 中创建、使用和删除触发器。触发器是强大的工具,可以帮助自动化操作、维护数据完整性、记录审计日志和实现复杂的业务逻辑。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

辞暮尔尔-烟火年年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值