当前位置: 首页 > news >正文

4.4 MySQL 触发器(Trigger)

触发器是一种特殊的数据库对象,在特定事件(如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 触发器的概述、语法、使用场景及实践案例,帮助您更高效地利用触发器实现数据库操作自动化。

相关文章:

4.4 MySQL 触发器(Trigger)

触发器是一种特殊的数据库对象&#xff0c;在特定事件&#xff08;如INSERT、UPDATE或DELETE&#xff09;触发时自动执行定义好的操作。它可以帮助我们实现更高效的数据管理和业务规则的约束。 1. 简介 1.1 什么是触发器 触发器&#xff08;Trigger&#xff09;是由用户定义的…...

C语言——break、continue、goto

目录 一、break 二、continue 1、在while循环中 2、在for循环中 三、go to 一、break 作用是终止循环&#xff0c;在循环内遇到break直接就跳出循环。 注&#xff1a; 一个break语句只能跳出一层循环。 代码演示&#xff1a; #include<stdio.h>void test01() {for (…...

oracle数据恢复总结篇

前言:数据恢复的关键 定删除时间点&#xff1a;首先&#xff0c;需要知道是什么时间进行的删除操作。 如果不能确定具体时间点&#xff0c;可以选择尽量准确的删除数据前的时间。 oracle数据库如果使用drop指令误删除了数据应该如何恢复呢&#xff1f; 如果没有进行其他操作&…...

运维面试题.云计算面试题之四.K8S

常见的k8s运维面试题 1、简述ETCD及其特点? etcd是一个用于配置共享和服务发现的键值存储系统,能够为整个分布式集群存储关键数据,协助集群正常运转 服务端将配置信息存储在etcd中,客户端从etcd中得到配置信息,etcd监听配置信息的变化,发现配置变化通知到客户端 特点 - 安…...

el-select 和el-tree二次封装

前言 本文章是本人在开发过程中&#xff0c;遇到使用树形数据&#xff0c;动态单选或多选的需求&#xff0c;element中没有这种组件&#xff0c;故自己封装一个&#xff0c;欢迎多多指教 开发环境&#xff1a;element-UI、vue2 组件效果 单选 多选 组件引用 <treeselec…...

C++11:多线程编程

目录 线程库基本用法创建线程给线程传递参数线程分离 常见数据未定义错误传递指针或引用指向局部变量的问题传递指针或引用指向已释放的内存的问题类成员函数作为入口函数&#xff0c;类对象被提前释放智能指针来解决该问题入口函数为类的私有成员函数 互斥量死锁 lock_guard与…...

【H2O2|全栈】JS进阶知识(八)ES6(4)

目录 前言 开篇语 准备工作 浅拷贝和深拷贝 浅拷贝 概念 常见方法 弊端 案例 深拷贝 概念 常见方法 弊端 逐层拷贝 原型 构造函数 概念 形式 成员 弊端 显式原型和隐式原型 概念 形式 constructor 概念 形式 原型链 概念 形式 结束语 前言 开篇语…...

OmniDiskSweeper :一款专为 macOS 设计的磁盘使用分析工具

OmniDiskSweeper 是一款专为 macOS 设计的磁盘使用分析工具&#xff0c;由 The Omni Group 开发。它的主要目的是帮助用户可视化磁盘上的文件和文件夹&#xff0c;并找出占用大量空间的文件&#xff0c;从而帮助用户释放磁盘空间。 OmniDiskSweeper 的特点包括&#xff1a; 简…...

【什么是Redis?】

Redis&#xff1a;高性能内存数据库的深度探索 在当今这个数据驱动的世界里&#xff0c;数据库的选择直接关系到应用程序的性能、可扩展性和可靠性。在众多数据库解决方案中&#xff0c;Redis以其卓越的性能、丰富的数据结构和灵活的使用场景脱颖而出&#xff0c;成为众多开发…...

React第十六章(useLayoutEffect)

useLayoutEffect useLayoutEffect 是 React 中的一个 Hook&#xff0c;用于在浏览器重新绘制屏幕之前触发。与 useEffect 类似。 用法 useLayoutEffect(() > {// 副作用代码return () > {// 清理代码}}, [dependencies]);参数 setup&#xff1a;Effect处理函数,可以返回…...

shell 基础知识2 ---条件测试

目录 一、条件测试的基本语法 二、文件测试表达式 三、字符串测试表达式 四、整数测试表达式 五、逻辑操作符 六、实验 为了能够正确处理 Shell 程序运行过程中遇到的各种情况&#xff0c; Linux Shell 提供了一组测试运算符。 通过这些运算符&#xff0c;Shell 程序能够…...

【线程】Java线程操作

【线程】Java线程操作 一、启动线程1.1 run()和start()的区别 二、终止线程三、等待线程四、线程的状态 一、启动线程 Java中通过start()方法来启动一个线程&#xff0c;其次我们要着重理解start()和run()的区别。 1.1 run()和start()的区别 我们通过一份代码来进行观察&…...

Linux内核

Linux内核是Linux操作系统的核心部分&#xff0c;它管理着硬件资源并提供基本的服务给用户程序。以下是Linux内核的几个关键方面&#xff1a; 1. 架构&#xff1a; 单内核设计&#xff1a;Linux采用的是单内核设计&#xff0c;这意味着所有操作系统服务都在一个地址空间内运行…...

Sentinel服务保护

Sentinel是阿里巴巴开源的一款服务保护框架&#xff0c;目前已经加入SpringCloudAlibaba中。官方网站&#xff1a; home | Sentinel Sentinel 的使用可以分为两个部分: 核心库&#xff08;Jar包&#xff09;&#xff1a;不依赖任何框架/库&#xff0c;能够运行于 Java 8 及以…...

python代码制作数据集的测试和数据质量检测思路

前言 本文指的数据集为通用数据集&#xff0c;并不单是给机器学习领域使用。包含科研和工业领域需要自己制作数据集的。 首先&#xff0c;在制作大型数据集时&#xff0c;代码错误和数据问题可能会非常复杂。 前期逻辑总是简单的&#xff0c;库库一顿写&#xff0c;等排查的时…...

笔记记录 k8s-install

master节点安装: yum upgrade -y 更新系统 yum update -y 升级内核 ifconfig ens33 关闭swap swapoff -a (临时) vim /etc/fstab (永久) #/dev/mapper/cl-swap swap swap defaults 0 0 vim /etc/sysctl.conf vm.swappin…...

丹摩征文活动|基于丹摩算力的可图(Kolors)的部署与使用

Kolors是一个以生成图像为目标的人工智能系统&#xff0c;可能采用了类似于OpenAI的DALLE、MidJourney等文本生成图像的技术。通过自然语言处理&#xff08;NLP&#xff09;和计算机视觉&#xff08;CV&#xff09;相结合&#xff0c;Kolors能够根据用户提供的文本描述生成符合…...

【Vue】 npm install amap-js-api-loader指南

前言 项目中的地图模块突然打不开了 正文 版本太低了&#xff0c;而且Vue项目就应该正经走项目流程啊喂&#xff01; npm i amap/amap-jsapi-loader --save 官方说这样执行完&#xff0c;就这结束啦&#xff01;它结束了&#xff0c;我还没有&#xff0c;不然不可能记录这篇文…...

MacOS下的Opencv3.4.16的编译

前言 MacOS下编译opencv还是有点麻烦的。 1、Opencv3.4.16的下载 注意&#xff0c;我们使用的是Mac&#xff0c;所以ios pack并不能使用。 如何嫌官网上下载比较慢的话&#xff0c;可以考虑在csdn网站上下载&#xff0c;应该也是可以找到的。 2、cmake的下载 官网的链接&…...

Android中的依赖注入(DI)框架Hilt

Hilt 是 Android 提供的一种依赖注入&#xff08;DI&#xff09;框架&#xff0c;它基于 Dagger&#xff0c;目的是简化依赖注入的使用&#xff0c;提供更易用的接口和与 Android 生命周期组件的紧密集成。下面是 Hilt 的详细介绍。 为什么选择 Hilt? 依赖注入的优势&#xf…...

19c补丁后oracle属主变化,导致不能识别磁盘组

补丁后服务器重启&#xff0c;数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后&#xff0c;存在与用户组权限相关的问题。具体表现为&#xff0c;Oracle 实例的运行用户&#xff08;oracle&#xff09;和集…...

使用VSCode开发Django指南

使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架&#xff0c;专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用&#xff0c;其中包含三个使用通用基本模板的页面。在此…...

大话软工笔记—需求分析概述

需求分析&#xff0c;就是要对需求调研收集到的资料信息逐个地进行拆分、研究&#xff0c;从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要&#xff0c;后续设计的依据主要来自于需求分析的成果&#xff0c;包括: 项目的目的…...

React Native 开发环境搭建(全平台详解)

React Native 开发环境搭建&#xff08;全平台详解&#xff09; 在开始使用 React Native 开发移动应用之前&#xff0c;正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南&#xff0c;涵盖 macOS 和 Windows 平台的配置步骤&#xff0c;如何在 Android 和 iOS…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)

CSI-2 协议详细解析 (一&#xff09; 1. CSI-2层定义&#xff08;CSI-2 Layer Definitions&#xff09; 分层结构 &#xff1a;CSI-2协议分为6层&#xff1a; 物理层&#xff08;PHY Layer&#xff09; &#xff1a; 定义电气特性、时钟机制和传输介质&#xff08;导线&#…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练

前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1)&#xff1a;从基础到实战的深度解析-CSDN博客&#xff0c;但实际面试中&#xff0c;企业更关注候选人对复杂场景的应对能力&#xff08;如多设备并发扫描、低功耗与高发现率的平衡&#xff09;和前沿技术的…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》

在注意力分散、内容高度同质化的时代&#xff0c;情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现&#xff0c;消费者对内容的“有感”程度&#xff0c;正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中&#xff0…...

2025盘古石杯决赛【手机取证】

前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来&#xff0c;实在找不到&#xff0c;希望有大佬教一下我。 还有就会议时间&#xff0c;我感觉不是图片时间&#xff0c;因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...

USB Over IP专用硬件的5个特点

USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中&#xff0c;从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备&#xff08;如专用硬件设备&#xff09;&#xff0c;从而消除了直接物理连接的需要。USB over IP的…...