MySQL触发器的使用详解
MySQL触发器的使用详解
MySQL触发器是一种特殊的存储过程,它与表操作紧密相关,并且在特定事件(如INSERT
、UPDATE
或DELETE
)发生时自动执行。触发器的主要目的是确保数据完整性、实现复杂的业务逻辑以及记录审计信息。它们可以在事件发生之前(BEFORE
)或之后(AFTER
)执行,并且针对每一行数据进行操作。下面我们将详细介绍如何创建和管理触发器,以及提供一些实用的示例。
1. 创建触发器
创建触发器的基本语法如下:
CREATE [DEFINER = { user | CURRENT_USER }] TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW [trigger_order] trigger_body;
trigger_name
: 触发器的名字。trigger_time
: 指定触发器是在事件之前(BEFORE
)还是之后(AFTER
)执行。trigger_event
: 定义触发事件类型,可以是INSERT
、UPDATE
或DELETE
。tbl_name
: 触发器关联的表名。FOR EACH ROW
: 表明这是一个行级触发器,意味着对于每一行数据的操作都会触发一次。trigger_order
: 可选参数,用于定义多个触发器之间的执行顺序,使用FOLLOWS
或PRECEDES
指定。trigger_body
: 触发器的具体执行内容,可以是一条或多条SQL语句,如果有多条语句,则需要用BEGIN...END
包裹起来。
示例:插入触发器
当向work
表中插入新记录时,会自动向time
表中添加当前时间戳:
CREATE TRIGGER trig1 AFTER INSERT ON work FOR EACH ROW
INSERT INTO time VALUES(NOW());
示例:更新触发器
每当account
表中的金额字段被更新时,检查并限制其值不超过100元:
DELIMITER //
CREATE TRIGGER upd_check BEFORE UPDATE ON account
FOR EACH ROW
BEGINIF NEW.amount < 0 THENSET NEW.amount = 0;ELSEIF NEW.amount > 100 THENSET NEW.amount = 100;END IF;
END//
DELIMITER ;
示例:删除触发器
当从student
表中删除一条记录时,不仅减少学生总数表中的计数,还会增加删除学生总数表中的计数:
DELIMITER //
CREATE TRIGGER tri_delete_stu AFTER DELETE ON student
FOR EACH ROW
BEGINUPDATE tj SET count = count - 1;UPDATE delete_stu SET count = count + 1;
END//
DELIMITER ;
2. 使用NEW
和OLD
关键字
在触发器内部,可以通过NEW
和OLD
两个伪记录来访问受影响的行。NEW
代表即将插入的新记录或更新后的新值;而OLD
则指向即将被替换或删除的旧记录。这使得我们能够在触发器中对这些值进行处理,例如验证、转换或记录变更日志。
NEW.columnName
: 引用新插入或更新后的列值。OLD.columnName
: 引用即将被更新或删除的原有列值。
3. 查看和删除触发器
要查看系统中存在的所有触发器,可以使用SHOW TRIGGERS
命令。若要删除某个特定的触发器,则可以使用DROP TRIGGER
命令。需要注意的是,删除一个表的同时也会删除该表上的所有触发器。
-- 查看所有触发器
SHOW TRIGGERS;-- 删除名为'trig1'的触发器
DROP TRIGGER IF EXISTS trig1;
4. 触发器的应用场景
触发器广泛应用于各种数据库操作中,以下是几个典型的应用场景:
-
自动化任务:比如自动记录表数据变化的日志、生成统计信息等。例如,在用户表中添加一条记录时,同时在日志表中记录这条记录的信息。
CREATE TABLE user_info (user_id INT AUTO_INCREMENT PRIMARY KEY,username VARCHAR(100),email VARCHAR(100) );CREATE TABLE user_operation_log (id INT AUTO_INCREMENT PRIMARY KEY,operation_type ENUM('INSERT', 'UPDATE', 'DELETE') NOT NULL,operation_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,user_id INT,operation_data JSON );-- 插入触发器 CREATE TRIGGER user_insert AFTER INSERT ON user_info FOR EACH ROW BEGININSERT INTO user_operation_log(operation_type, user_id, operation_data)VALUES ('INSERT', NEW.user_id, JSON_OBJECT('user_id', NEW.user_id, 'username', NEW.username, 'email', NEW.email)); END;
-
数据验证:可以在数据更新时验证数据的完整性和正确性。例如,确保账户余额始终非负。
-
实时同步:保持多个表之间的一致性。例如,当主表的数据发生变化时,相应的变更也会反映到备份表中。
-
复杂业务逻辑:实现比简单约束更复杂的规则。例如,每当有新的员工加入公司时,自动更新部门中的人数。
5. 注意事项
虽然触发器提供了强大的功能,但它们也可能引入性能问题,特别是在高并发环境下。因此,在设计和使用触发器时应该遵循以下原则:
- 谨慎使用:尽量避免过度依赖触发器,因为它们可能会增加系统的复杂度并且难以调试。
- 高效执行:确保触发器内的代码尽可能简洁高效,以减少对整体性能的影响。
- 考虑替代方案:在某些情况下,应用程序级别的逻辑可能更适合处理类似的任务。
- 测试充分:在生产环境中部署触发器之前,务必进行全面测试,确保其行为符合预期。
总之,MySQL触发器作为一种自动化的工具,能够帮助开发者简化复杂的业务逻辑处理,提高数据一致性和安全性。然而,合理规划和优化触发器的使用同样重要,以保证系统的稳定性和效率。通过上述介绍,希望能够为您提供足够的知识基础,以便您能够在实际项目中有效地利用MySQL触发器。
相关文章:
MySQL触发器的使用详解
MySQL触发器的使用详解 MySQL触发器是一种特殊的存储过程,它与表操作紧密相关,并且在特定事件(如INSERT、UPDATE或DELETE)发生时自动执行。触发器的主要目的是确保数据完整性、实现复杂的业务逻辑以及记录审计信息。它们可以在事…...
关于NLP交互式系统的一些基础入门
【1】What 基于自然语言处理(NLP)的交互式系统是指能够理解、解析并生成人类自然语言的计算机程序。这些系统旨在通过文本或语音与用户进行交流,以提供信息、解决问题或执行任务。以下是关于这类系统的一些关键点: 核心技术&…...
如何在HTML中修改光标的位置(全面版)
如何在HTML中修改光标的位置(全面版) 在Web开发中,控制光标位置是一个重要的技巧,尤其是在表单处理、富文本编辑器开发或格式化输入的场景中。HTML中的光标位置操作不仅适用于表单元素(如<input>和<textarea…...
PHP8 动态属性被弃用兼容方案
PHP 类中可以动态设置和获取没有声明过的类属性。这些属性不遵循具体的规则,并且需要使用 __get() 和 __set() 魔术方法对动态属性如何读写进行有效控制。 class User {private int $uid; }$user new User(); $user->name Foo; 上述代码中,User 类…...

WPF表格控件的列利用模块适配动态枚举类
将枚举列表转化到类内部赋值,在初始化表格行加载和双击事件时,触发类里面的枚举列表的赋值 <c1:Column Header"变更类型" Binding"{Binding ChangeType, ModeTwoWay, ValidatesOnExceptionsTrue, ValidatesOnDataErrorsTrue, NotifyOn…...
【sgUploadImage】自定义组件:基于elementUI的el-upload封装的上传图片、相片组件,适用于上传缩略图、文章封面
sgUploadImage源码 <template><div :class"$options.name"><ul class"uploadImages"><liclass"uploadImage"v-loading"loadings[i]"v-for"(a, i) in uploadImages":key"i"click"click…...
Scala的隐式转换
一: 1.隐式转换概述: 隐式转换与模式匹配都是scala中提供的比较强大的特性。 2.隐式转换的定义: 在实际编程中,要想把一个不匹配的类型赋值,需要先转换成匹配的类型。scala的隐式转换会自动将一种类型的数据转换成…...

从视频编码的进化历程看技术革新
人类对影像的记录和传播从未停止。从最早的胶片电影到如今的数字视频,技术在不断演进。在这个过程中,视频编码技术的发展扮演着关键角色,它决定着我们如何高效地存储和传输视频内容。 视频编码技术的发展历程充满智慧。上世纪90年代…...

ECharts柱状图-阶梯瀑布图,附视频讲解与代码下载
引言: 在数据可视化的世界里,ECharts凭借其丰富的图表类型和强大的配置能力,成为了众多开发者的首选。今天,我将带大家一起实现一个柱状图图表,通过该图表我们可以直观地展示和分析数据。此外,我还将提供…...

如何让Google快速收录你的页面?
要让Google更快地收录你的网站内容,首先需要理解“爬虫”这个概念。Google的爬虫是帮助它发现和评估网站内容质量的工具,如果你的页面质量高且更新频率稳定,那么Google爬虫更可能频繁光顾。通常情况下,通过Google Search Console&…...
比例负载分配L(P);动态调整服务率:LDS
目录 比例负载分配L(P) 动态调整服务率:LDS 速度缩放技术 比例负载分配L(P) 优点 简单直观:其调度器按照服务器服务率倒数比例分配负载,这种方式易于理解和实现,不需要复杂的计算和调整机制。例如,在一个小型企业内部的简单云计算环境中,若服务器配置相对单一且任务类型…...

C++ ——— 类的 6 个默认成员函数之 构造函数
目录 何为默认成员函数 一、构造函数 构造函数的概念 构造函数的特性 日期类的构造函数 栈的构造函数 编译器自动生成的构造函数 总结 何为默认成员函数 默认成员函数就是用户没有显示实现,但是编译器会自动生成的成员函数称为默认成员函数 一、构造函数 …...

win11 恢复任务栏copilot图标, 亲测有效
1、修改C:\Windows\System32\IntegratedServicesRegionPolicySet.json,解除中国不能使用copilot的限制。 使用Notepad搜索copilot全文搜索,将下面两处的“CN,”删除,删除后如下: {"$comment": "Show Copilot on t…...

计算机网络-IPSec VPN工作原理
一、IPSec VPN工作原理 昨天我们大致了解了IPSec是什么,今天来学习下它的工作原理。 IPsec的基本工作流程如下: 通过IKE协商第一阶段协商出IKE SA。 使用IKE SA加密IKE协商第二阶段的报文,即IPsec SA。 使用IPsec SA加密数据。 IPsec基本工作…...

Tomcat项目本地部署
前言: 除了在idea中将项目启动之外,也可以将项目部署在本地tomcat或者云服务器上,本片文章主要介绍了怎样将项目部署在本地tomcat 下面介绍如何使用Tomcat部署本地项目: 1、本篇文章使用的项目案例为一个聚合项目,ha…...

开源数据同步中间件(Dbsyncer)简单玩一下 mysql to mysql 的增量,全量配置
一、什么是Dbsyncer 1、介绍 Dbsyncer是一款开源的数据同步中间件,提供MySQL、Oracle、SqlServer、PostgreSQL、Elasticsearch(ES)、Kafka、File、SQL等同步场景,支持上传插件自定义同步转换业务,提供监控全量和增量数据统计图、应用性能预警…...
虚幻引擎开发命名规则
UE的命名规则如下: 模版类以T作为前缀,例如TArray, TMap, TSet。UObject派生类都以U前缀。AActor派生类都以A前缀。SWidget派生类都以S前缀。全局对象使用G开头,如GEngine。抽象接口以I前缀。枚举以E开头。bool变量以b前缀,如bPe…...
解释强化学习中的batch, epoch, episode有什么区别与联系,分别有什么作用
强化学习中的batch, epoch, episode 1.Batch1.1 最后一个batch不足32该怎么处理?1.1.1 方法一:丢弃最后一个不完整的 batch1.1.2 方法二:填充最后一个不完整的 batch1.1.3 选择哪种方法? 2.Epoch3.Episode4.区别与联系4.1 区别4.2…...

MVC基础——市场管理系统(一)
文章目录 项目地址一、创建项目结构1.1 创建程序以及Controller1.2 创建View1.3 创建Models层,并且在Edit页面显示1.4 创建Layou模板页面1.5 创建静态文件css中间件二、Categories的CRUD2.1 使用静态仓库存储数据2.2 将Categorie的列表显示在页面中(List)2.3 创建_ViewImport.…...

使用docker-compose安装Milvus向量数据库及Attu可视化连接工具
首先确保系统已经安装上了docker 然后去https://github.com/docker/compose/releases/下载安装docker-compose 跟随自己下系统和服务器情况下载 上传到服务器 mv docker-compose-linux-aarch64 docker-compose chmod x docker-compose2.dockr-compose命令 docker-compose …...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试
作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...
Go 语言接口详解
Go 语言接口详解 核心概念 接口定义 在 Go 语言中,接口是一种抽象类型,它定义了一组方法的集合: // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的: // 矩形结构体…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作
一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

深度学习习题2
1.如果增加神经网络的宽度,精确度会增加到一个特定阈值后,便开始降低。造成这一现象的可能原因是什么? A、即使增加卷积核的数量,只有少部分的核会被用作预测 B、当卷积核数量增加时,神经网络的预测能力会降低 C、当卷…...
服务器--宝塔命令
一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行! sudo su - 1. CentOS 系统: yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...

论文笔记——相干体技术在裂缝预测中的应用研究
目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术:基于互相关的相干体技术(Correlation)第二代相干体技术:基于相似的相干体技术(Semblance)基于多道相似的相干体…...
Webpack性能优化:构建速度与体积优化策略
一、构建速度优化 1、升级Webpack和Node.js 优化效果:Webpack 4比Webpack 3构建时间降低60%-98%。原因: V8引擎优化(for of替代forEach、Map/Set替代Object)。默认使用更快的md4哈希算法。AST直接从Loa…...

Razor编程中@Html的方法使用大全
文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...
BLEU评分:机器翻译质量评估的黄金标准
BLEU评分:机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域,衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标,自2002年由IBM的Kishore Papineni等人提出以来,…...