4.4 MySQL 触发器(Trigger)

devtools/2024/11/24 5:41:34/

触发器是一种特殊的数据库对象,在特定事件(如INSERTUPDATEDELETE)触发时自动执行定义好的操作。它可以帮助我们实现更高效的数据管理和业务规则的约束。


1. 简介

1.1 什么是触发器

触发器(Trigger)是由用户定义的一组 SQL 语句,在数据库表上进行某些特定操作时自动触发执行。

1.2 触发器的作用

  • 数据一致性:在数据修改前后执行验证,确保数据的完整性和一致性。
  • 自动化处理:简化业务逻辑,例如记录日志、更新关联表。
  • 强制约束:在数据库层面实现复杂规则,避免业务逻辑遗漏。

1.3 触发器的特性

  • 每个触发器绑定到一个表。
  • 支持触发的事件:INSERTUPDATEDELETE
  • 支持触发时机:BEFORE(操作之前触发)和 AFTER(操作之后触发)。
  • 不支持触发器内直接调用事务控制语句(如COMMITROLLBACK)。

2. 语法

2.1 创建触发器

CREATE TRIGGER 触发器名
{BEFORE | AFTER} {INSERT | UPDATE | DELETE}
ON 表名
FOR EACH ROW
触发器逻辑;
  • 触发时机
    • BEFORE:在事件发生之前执行。
    • AFTER:在事件发生之后执行。
  • 触发事件
    • INSERT:插入新数据时触发。
    • UPDATE:更新数据时触发。
    • DELETE:删除数据时触发。
  • 触发器逻辑BEGINEND 包含的多条 SQL 语句。

2.2 删除触发器

DROP TRIGGER [IF EXISTS] 触发器名;

2.3 查看触发器

SHOW TRIGGERS;

3. 使用场景

3.1 日志记录

在表发生数据变更时,将操作记录到日志表中。

3.2 自动计算

根据插入或更新的值自动更新其他表或字段。

3.3 数据验证

在插入或更新数据前检查合法性。

3.4 联动更新

修改某表数据时,自动同步更新关联表数据。


4. 案例

4.1 日志记录案例

需求

employees 表中插入新员工时,将操作记录到 employee_logs 表中。

表结构
CREATE TABLE employees (emp_id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(100),position VARCHAR(50),salary DECIMAL(10, 2)
);CREATE TABLE employee_logs (log_id INT PRIMARY KEY AUTO_INCREMENT,emp_id INT,log_time DATETIME,action VARCHAR(50)
);
创建触发器
DELIMITER $$CREATE TRIGGER trg_employee_insert
AFTER INSERT ON employees
FOR EACH ROW
BEGININSERT INTO employee_logs (emp_id, log_time, action)VALUES (NEW.emp_id, NOW(), 'INSERT');
END$$DELIMITER ;
  • NEW关键字:表示新插入的行数据。
  • 触发逻辑:在插入 employees 表后,将信息记录到日志表中。
测试触发器
INSERT INTO employees (name, position, salary)
VALUES ('Alice', 'Manager', 8000.00);SELECT * FROM employee_logs;

4.2 数据验证案例

需求

禁止在 employees 表中插入薪资低于 3000 的员工。

创建触发器
DELIMITER $$CREATE TRIGGER trg_employee_salary_check
BEFORE INSERT ON employees
FOR EACH ROW
BEGINIF NEW.salary < 3000 THENSIGNAL SQLSTATE '45000'SET MESSAGE_TEXT = 'Salary must be at least 3000';END IF;
END$$DELIMITER ;
  • SIGNAL语句:用于抛出自定义错误。
  • 触发逻辑:在插入之前检查薪资是否符合要求。
测试触发器
INSERT INTO employees (name, position, salary)
VALUES ('Bob', 'Developer', 2000); -- 触发错误

4.3 联动更新案例

需求

当更新 employees 表的员工薪资时,将变更记录到 employee_logs 表中。

创建触发器
DELIMITER $$CREATE TRIGGER trg_employee_update
AFTER UPDATE ON employees
FOR EACH ROW
BEGININSERT INTO employee_logs (emp_id, log_time, action)VALUES (OLD.emp_id, NOW(), CONCAT('UPDATE: ', OLD.salary, ' -> ', NEW.salary));
END$$DELIMITER ;
  • OLD关键字:表示更新前的行数据。
  • 触发逻辑:记录薪资变更的详细信息。
测试触发器
UPDATE employees
SET salary = 9000
WHERE emp_id = 1;SELECT * FROM employee_logs;

5. 注意事项

  • 触发器的数量限制:每个表每种事件最多只能有一个 BEFORE 和一个 AFTER 触发器。
  • 性能影响:触发器的执行会增加额外的系统开销,建议在必要时使用。
  • 错误处理:在触发器中使用 SIGNAL 语句处理业务逻辑错误。
  • 事务支持:触发器的执行与其事件处于同一事务中,事务回滚会撤销触发器的操作。

以上内容涵盖了 MySQL 触发器的概述、语法、使用场景及实践案例,帮助您更高效地利用触发器实现数据库操作自动化。


http://www.ppmy.cn/devtools/136468.html

相关文章

react中Fragment的使用场景

在 React 中&#xff0c;Fragment 是一个非常有用的组件&#xff0c;允许你将多个子元素包裹在一起&#xff0c;而不会在 DOM 中产生额外的节点。它通常用于以下几个场景&#xff1a; import React, {Fragment} from react; 1. 返回多个子元素而不添加额外的 DOM 元素&#x…

CSS 设置宽高的单位概览

CSS 设置宽高的单位概览 在 CSS 中&#xff0c;设置宽度和高度的单位有多种&#xff0c;每种单位都有特定的用途和适用场景。下面是常见的单位整理及使用示例。 单位类型代表性单位使用场景视口单位vw, vh响应式布局&#xff0c;全屏背景百分比单位%相对父元素的宽高调整绝对…

自监督学习:从概念到应用的全面解析

引言 自监督学习&#xff08;Self-Supervised Learning, SSL&#xff09;是近年来机器学习领域的重要进展&#xff0c;它以未标注数据为核心&#xff0c;通过设计自生成标签的任务&#xff0c;挖掘数据的潜在结构和特征表示。在计算机视觉、自然语言处理&#xff08;NLP&#…

【一篇搞定配置】网络分析工具WireShark的安装与入门使用

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;各种软件安装与配置_十二月的猫的博客-CSDN博客 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目录 1.…

centos一键卸载docker脚本

#!/bin/bash# 检查是否以 root 用户运行 if [ "$EUID" -ne 0 ]; thenecho "请使用 root 用户或通过 sudo 执行该脚本&#xff01;"exit 1 fiecho "停止 Docker 服务..." systemctl stop dockerecho "卸载 Docker 软件包..." yum remov…

linux下的spi开发与框架源码分析

目录 1 概述 2 spi子系统框架 3 spi硬件原理回顾 4 框架下spi的应用 4.1 在驱动中使用spi 4.1.1 使用框架与流程 4.1.2 示例分析 4.2 在应用使用spi 5 spi硬件驱动开发 6 spi子系统源码分析 6.1 子系统加载 6.2 注册controller过程 6.3数据收发过程 6.4 数据关系…

有关django、python版本、sqlite3版本冲突问题

本篇是解析为什么会出现python版本使用旧版本的sqlite3版本的问题&#xff0c;解决办法在下面有备注&#xff0c;如有遗漏之处或错误&#xff0c;望佬们指出&#xff0c;再次感谢不禁~~ 【坑点】更新python版本&#xff0c;并不会让sqlite版本实时更新&#xff0c;依旧是调用首…

微软Visual C++ 2015运行时库:轻松运行C++应用程序的必备工具

微软Visual C 2015运行时库&#xff1a;轻松运行C应用程序的必备工具 【下载地址】MicrosoftVisualC2015Redistributablex64x86安装包下载 本仓库提供Microsoft Visual C 2015 Redistributable x64/x86安装包的下载。该安装包包含了Visual C库的运行时组件&#xff0c;这些组件…