当前位置: 首页 > 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 …...

PostgreSQL函数中使用now()或current_timestamp的异同

在PostgreSQL函数中使用now()或current_timestamp可以获取当前的日期和时间。 now()函数返回当前的日期和时间&#xff0c;包括时区信息。它可以用于记录操作的时间戳或在查询中进行时间比较。 current_timestamp函数也返回当前的日期和时间&#xff0c;但不包括时区信息。它…...

开发类似的同款小程序系统制作流程

很多老板想要开发一款和别人家类似的同款小程序系统&#xff0c;但是不知道该怎么开发制作&#xff0c;本文就为大家详细介绍一下开发类似的同款小程序的流程为大家做参考。 一、前期准备找到对标小程序&#xff1a;首先&#xff0c;需要找到你想要模仿的同款小程序&#xff0…...

bsp是板级支持包

里面有很多的针对该型号的板子的函数&#xff0c;可以直接调用&#xff0c;也可以直接在里面。 也可以在vivado的sdk上&#xff0c;看到很多相关文档和寄存器偏移等等。...

P1784 数独 C语言(普遍超时写法)

题目&#xff1a; https://www.luogu.com.cn/problem/P1784 题目描述 数独是根据 99 盘面上的已知数字&#xff0c;推理出所有剩余空格的数字&#xff0c;并满足每一行、每一列、每一个粗线宫内的数字均含 1−9 &#xff0c;不重复。每一道合格的数独谜题都有且仅有唯一答案…...

基于最新的Apache StreamPark搭建指南

一、StreamPark 的介绍 官方文档:Apache StreamPark (incubating) | Apache StreamPark (incubating) 中文文档:Apache StreamPark (incubating) | Apache StreamPark (incubating)Github地址:https://github.com/apache/incubator-streampark Apache StreamPark™ 是一个…...

思科模拟器路由器的基本配置

一、实验目的 了解路由器的作用掌握路由器的基本配置方法 3、掌握路由器模块的使用和互连方式 二、实验环境 2811路由器一台&#xff0c;计算机两台&#xff0c;Console配置线一根&#xff0c;网线若干&#xff1b;本实验拓扑图如图8-1所示&#xff1b;计算机IP地址规划如表8-…...

vue3 computed watch 拓展reduce函数

computed computed 计算属性计算属性 就是当依赖的属性的值发生变化的时候&#xff0c;才会触发他的更改&#xff0c;如果依赖的值&#xff0c;不发生变化的时候&#xff0c;使用的是缓存中的属性值。 import {reactive,ref,computed} from "vue"//price 改变&…...

MyBatis 中 SQL 片段复用

MyBatis 中 SQL 片段复用&#xff1a;提升代码效率与可维护性 在使用 MyBatis 进行数据库操作时&#xff0c;常常会遇到一些 SQL 语句的部分内容重复出现的情况&#xff0c;比如多个查询语句都涉及相同的字段列表。这时&#xff0c;MyBatis 的 SQL 片段复用功能就派上用场了。…...

【实操GPT-SoVits】声音克隆模型图文版教程

项目github地址&#xff1a;https://github.com/RVC-Boss/GPT-SoVITS.git官方教程&#xff1a;https://www.yuque.com/baicaigongchang1145haoyuangong/ib3g1e/tkemqe8vzhadfpeu本文旨在迅速实操GPT-SoVits项目&#xff0c;不阐述技术原理&#xff08;后期如果有时间研究&#…...

用HTML和CSS实现3D圣诞树效果

简介 随着圣诞节的临近&#xff0c;许多开发者喜欢在自己的项目中加入一些节日氛围。今天&#xff0c;我们将学习如何使用HTML和CSS来实现一个简单的3D圣诞树效果。通过这些基本的前端技术&#xff0c;我们可以制作出富有创意的视觉效果&#xff0c;并为网站增添节日气氛。 本…...

the7企业中 英文wordpress模板/前端seo主要优化哪些

Pod调度 在默认情况下&#xff0c;一个Pod在哪个Node节点上运行&#xff0c;是由Scheduler组件采用相应的算法计算出来的&#xff0c;这个过程是不受人工控制的。但是在实际使用中&#xff0c;这并不满足的需求&#xff0c;因为很多情况下&#xff0c;我们想控制某些Pod到达某…...

老网站做成适合手机端的网站怎么做/网址搜索引擎

当定义 没有初始化式 的变量&#xff08;如int i;&#xff09;时&#xff0c;系统 有可能 会为我们进行隐式的初始化。至于系统是否帮我们隐式初始化变量&#xff0c;以及为变量赋予一个怎样的初始值&#xff0c;这要取决于该 变量的类型 以及我们在 何处定义的该变量 。1】内置…...

wordpress好用的企业展示主题/百度云盘登录电脑版

来源&#xff1a;https://www.zhihu.com/question/22418107/answer/285989585我不太喜欢跟她打电话&#xff0c;也懒得跟她沟通。 嫌她反应好慢&#xff0c;理解能力又差&#xff0c;也没见过什么市面&#xff0c;又笨又善良&#xff0c;因此被骗过很多次也不长记性。好多时候跟…...

深圳网站备案时间/做游戏推广一个月能拿多少钱

1 树节点Entry TreeMap树的节点是Entry 对象&#xff0c;Entry是TreeMap的一个内部类。 在TreeMap&#xff08;红黑树&#xff09;中false代表红色&#xff0c;true代表红色。 // Red-black mechanicsprivate static final boolean RED false;private static final boolea…...

基于拍卖的拍卖网站开发/seo网站优化经理

一. 苹果ios官网 1.主页 http://developer.apple.com/ios 官网上的入门教程 http://developer.apple.com/library/ios/#referencelibrary/GettingStarted/RoadMapiOSCh/chapters/Introduction.html 2.管理设备列表页 &#xff08;右上角【IOS provisioning Portal】->左侧…...

徐州金网网站建设/企业网站推广建议

目录 一、GNS 3的简介 二、GNS 3的版本说明 三、GNS 3的安装过程 四、GNS 3 VM的导入 五、GNS3 VM的初始配置 六、GNS 3VM的主界面介绍 七、添加路由器设备与连线 八、设备的开启与本地连接 九、IDLE设备 十、添加设备的模块 十一、关联Secure CRT 十二、与物理机通…...