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

MySQL触发器的使用详解

MySQL触发器的使用详解

MySQL触发器是一种特殊的存储过程,它与表操作紧密相关,并且在特定事件(如INSERTUPDATEDELETE)发生时自动执行。触发器的主要目的是确保数据完整性、实现复杂的业务逻辑以及记录审计信息。它们可以在事件发生之前(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: 定义触发事件类型,可以是INSERTUPDATEDELETE
  • tbl_name: 触发器关联的表名。
  • FOR EACH ROW: 表明这是一个行级触发器,意味着对于每一行数据的操作都会触发一次。
  • trigger_order: 可选参数,用于定义多个触发器之间的执行顺序,使用FOLLOWSPRECEDES指定。
  • 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. 使用NEWOLD关键字

在触发器内部,可以通过NEWOLD两个伪记录来访问受影响的行。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触发器是一种特殊的存储过程&#xff0c;它与表操作紧密相关&#xff0c;并且在特定事件&#xff08;如INSERT、UPDATE或DELETE&#xff09;发生时自动执行。触发器的主要目的是确保数据完整性、实现复杂的业务逻辑以及记录审计信息。它们可以在事…...

关于NLP交互式系统的一些基础入门

【1】What 基于自然语言处理&#xff08;NLP&#xff09;的交互式系统是指能够理解、解析并生成人类自然语言的计算机程序。这些系统旨在通过文本或语音与用户进行交流&#xff0c;以提供信息、解决问题或执行任务。以下是关于这类系统的一些关键点&#xff1a; 核心技术&…...

如何在HTML中修改光标的位置(全面版)

如何在HTML中修改光标的位置&#xff08;全面版&#xff09; 在Web开发中&#xff0c;控制光标位置是一个重要的技巧&#xff0c;尤其是在表单处理、富文本编辑器开发或格式化输入的场景中。HTML中的光标位置操作不仅适用于表单元素&#xff08;如<input>和<textarea…...

PHP8 动态属性被弃用兼容方案

PHP 类中可以动态设置和获取没有声明过的类属性。这些属性不遵循具体的规则&#xff0c;并且需要使用 __get() 和 __set() 魔术方法对动态属性如何读写进行有效控制。 class User {private int $uid; }$user new User(); $user->name Foo; 上述代码中&#xff0c;User 类…...

WPF表格控件的列利用模块适配动态枚举类

将枚举列表转化到类内部赋值&#xff0c;在初始化表格行加载和双击事件时&#xff0c;触发类里面的枚举列表的赋值 <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的隐式转换

一&#xff1a; 1.隐式转换概述&#xff1a; 隐式转换与模式匹配都是scala中提供的比较强大的特性。 2.隐式转换的定义&#xff1a; 在实际编程中&#xff0c;要想把一个不匹配的类型赋值&#xff0c;需要先转换成匹配的类型。scala的隐式转换会自动将一种类型的数据转换成…...

从视频编码的进化历程看技术革新

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

ECharts柱状图-阶梯瀑布图,附视频讲解与代码下载

引言&#xff1a; 在数据可视化的世界里&#xff0c;ECharts凭借其丰富的图表类型和强大的配置能力&#xff0c;成为了众多开发者的首选。今天&#xff0c;我将带大家一起实现一个柱状图图表&#xff0c;通过该图表我们可以直观地展示和分析数据。此外&#xff0c;我还将提供…...

如何让Google快速收录你的页面?

要让Google更快地收录你的网站内容&#xff0c;首先需要理解“爬虫”这个概念。Google的爬虫是帮助它发现和评估网站内容质量的工具&#xff0c;如果你的页面质量高且更新频率稳定&#xff0c;那么Google爬虫更可能频繁光顾。通常情况下&#xff0c;通过Google Search Console&…...

比例负载分配L(P);动态调整服务率:LDS

目录 比例负载分配L(P) 动态调整服务率:LDS 速度缩放技术 比例负载分配L(P) 优点 简单直观:其调度器按照服务器服务率倒数比例分配负载,这种方式易于理解和实现,不需要复杂的计算和调整机制。例如,在一个小型企业内部的简单云计算环境中,若服务器配置相对单一且任务类型…...

C++ ——— 类的 6 个默认成员函数之 构造函数

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

win11 恢复任务栏copilot图标, 亲测有效

1、修改C:\Windows\System32\IntegratedServicesRegionPolicySet.json&#xff0c;解除中国不能使用copilot的限制。 使用Notepad搜索copilot全文搜索&#xff0c;将下面两处的“CN,”删除&#xff0c;删除后如下&#xff1a; {"$comment": "Show Copilot on t…...

计算机网络-IPSec VPN工作原理

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

Tomcat项目本地部署

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

开源数据同步中间件(Dbsyncer)简单玩一下 mysql to mysql 的增量,全量配置

一、什么是Dbsyncer 1、介绍 Dbsyncer是一款开源的数据同步中间件&#xff0c;提供MySQL、Oracle、SqlServer、PostgreSQL、Elasticsearch(ES)、Kafka、File、SQL等同步场景&#xff0c;支持上传插件自定义同步转换业务&#xff0c;提供监控全量和增量数据统计图、应用性能预警…...

虚幻引擎开发命名规则

UE的命名规则如下&#xff1a; 模版类以T作为前缀&#xff0c;例如TArray, TMap, TSet。UObject派生类都以U前缀。AActor派生类都以A前缀。SWidget派生类都以S前缀。全局对象使用G开头&#xff0c;如GEngine。抽象接口以I前缀。枚举以E开头。bool变量以b前缀&#xff0c;如bPe…...

解释强化学习中的batch, epoch, episode有什么区别与联系,分别有什么作用

强化学习中的batch, epoch, episode 1.Batch1.1 最后一个batch不足32该怎么处理&#xff1f;1.1.1 方法一&#xff1a;丢弃最后一个不完整的 batch1.1.2 方法二&#xff1a;填充最后一个不完整的 batch1.1.3 选择哪种方法&#xff1f; 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:用于评估无人机上具身智能体的综合性基准测试

作者&#xff1a;Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位&#xff1a;中南大学地球科学与信息物理学院论文标题&#xff1a;BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接&#xff1a;https://arxiv.…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)

0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述&#xff0c;后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作&#xff0c;其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

Go 语言接口详解

Go 语言接口详解 核心概念 接口定义 在 Go 语言中&#xff0c;接口是一种抽象类型&#xff0c;它定义了一组方法的集合&#xff1a; // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的&#xff1a; // 矩形结构体…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作

一、上下文切换 即使单核CPU也可以进行多线程执行代码&#xff0c;CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短&#xff0c;所以CPU会不断地切换线程执行&#xff0c;从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

深度学习习题2

1.如果增加神经网络的宽度&#xff0c;精确度会增加到一个特定阈值后&#xff0c;便开始降低。造成这一现象的可能原因是什么&#xff1f; A、即使增加卷积核的数量&#xff0c;只有少部分的核会被用作预测 B、当卷积核数量增加时&#xff0c;神经网络的预测能力会降低 C、当卷…...

服务器--宝塔命令

一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行&#xff01; sudo su - 1. CentOS 系统&#xff1a; yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...

论文笔记——相干体技术在裂缝预测中的应用研究

目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术&#xff1a;基于互相关的相干体技术&#xff08;Correlation&#xff09;第二代相干体技术&#xff1a;基于相似的相干体技术&#xff08;Semblance&#xff09;基于多道相似的相干体…...

Webpack性能优化:构建速度与体积优化策略

一、构建速度优化 1、​​升级Webpack和Node.js​​ ​​优化效果​​&#xff1a;Webpack 4比Webpack 3构建时间降低60%-98%。​​原因​​&#xff1a; V8引擎优化&#xff08;for of替代forEach、Map/Set替代Object&#xff09;。默认使用更快的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评分&#xff1a;机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域&#xff0c;衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标&#xff0c;自2002年由IBM的Kishore Papineni等人提出以来&#xff0c;…...