我在广州学Mysql 系列——触发器的使用
ℹ️大家好,我是练小杰,这周是春节前的最后一周了,现在一双手数都能数得过来了!!
本播客将学习MYSQL中触发器的相关概念以及基础命令~~
回顾:👉【MYSQL视图相关例题】
数据库专栏👉【数据库专栏】~
想要了解更多内容,主页 【练小杰的CSDN】
文章目录
- 触发器
- 触发器的类型
- 触发的条件
- 触发器的优缺点
- 创建触发器
- 创建只有一个执行语句的触发器
- 创建有多个执行语句的触发器
- 一个触发器示例说明
- 查看触发器
- SHOW TRIGGERS语句查看触发器信息
- `triggers`表中查看触发器信息
- 删除触发器
- 综合案例——触发器使用
- 步骤1:创建persons表
- 步骤2:创建一个销售额表sales
- 步骤3:创建一个触发器
- 步骤4:向persons表中插入记录
- 步骤5:查看表persons和 sales
- 步骤6:查看触发器
触发器
- 定义:触发器是一种与表关联的数据库事件处理程序,当发生特定事件(如插入、更新、删除等)时,触发器会自动执行相关的SQL语句。
- 同时,触发器的执行不是由程序调用或手工启动,而是由事件来触发的。
- 在某些触发程序的用法中,可用于检查插入到表中的值,或对更新涉及的值进行计算。
触发器的类型
- MySQL支持以下几种类型的触发器:
BEFORE
触发器: 在指定操作(如INSERT、UPDATE、DELETE)发生之前执行。
AFTER
触发器: 在指定操作发生之后执行。
触发的条件
- 针对每种操作类型,触发器可以针对以下表的操作定义:
INSERT
:当向表中插入新行时触发。UPDATE
:当更新表中的行时触发。DELETE
:当从表中删除行时触发。
触发器的优缺点
- 优点:
自动化:触发器可以自动执行某些操作,减少手动操作的错误和工作量。
数据完整性:触发器可以加强数据的完整性约束,确保数据的合法性。
- 缺点:
性能影响:触发器会在表操作时立即执行,复杂的业务逻辑会增加操作延迟。
调试困难:触发器的调试相对复杂,建议在开发阶段充分测试。
逻辑复杂:避免在触发器中编写过于复杂的逻辑,以免影响数据库的稳定性。
创建触发器
- 基本语法如下:
CREATE TRIGGER trigger_name
{BEFORE | AFTER} {INSERT | UPDATE | DELETE}
ON table_name
FOR EACH ROW
trigger_body;
- 命令说明:
trigger_name
:触发器的名称。
BEFORE | AFTER
:指定触发时机。
INSERT | UPDATE | DELETE
:指定触发事件。
table_name
:触发器作用的表名。
FOR EACH ROW
:表示触发器针对表中的每一行数据执行。
trigger_body
:定义触发器的业务逻辑,可以包含多个SQL语句。
创建只有一个执行语句的触发器
- 创建一个触发器,语法如下:
CREATE TRIGGER trigger_name trigger_time trigger_eventON tbl_name FOR EACH ROW trigger_stmt
创建有多个执行语句的触发器
- 当需要在触发器中执行多个操作时,可以使用
BEGIN...END
块来包含这些语句。
一个触发器示例说明
假设我们有一个
employees
表和一个audit_log
表。我们希望在向employees
表中插入、更新或删除数据时,自动在audit_log
表中记录相应的操作日志。
- 定义表的结构
创建employees和audit_log表:
CREATE TABLE employees (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(100),position VARCHAR(100),salary DECIMAL(10, 2),created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);CREATE TABLE audit_log (log_id INT AUTO_INCREMENT PRIMARY KEY,employee_id INT,action VARCHAR(10),action_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,details VARCHAR(255)
);
- 触发器1:插入操作后记录日志
向employees表中插入新员工时,记录日志。
DELIMITER $$CREATE TRIGGER after_insert_employees
AFTER INSERT ON employees
FOR EACH ROW
BEGIN-- 插入审计日志INSERT INTO audit_log (employee_id, action, details)VALUES (NEW.id, 'INSERT', CONCAT('Added new employee: ', NEW.name));-- 这里还可以添加更多操作,例如发送通知等
END$$DELIMITER ;
- 触发器2:更新操作后记录日志
每次更新employees表中的员工信息时,都记录日志。
DELIMITER $$CREATE TRIGGER after_update_employees
AFTER UPDATE ON employees
FOR EACH ROW
BEGIN-- 检查是否有字段被修改IF NEW.name <> OLD.name OR NEW.position <> OLD.position OR NEW.salary <> OLD.salary THEN-- 插入审计日志INSERT INTO audit_log (employee_id, action, details)VALUES (NEW.id, 'UPDATE', CONCAT('Updated employee: ', NEW.name, ', Position: ', NEW.position, ', Salary: ', NEW.salary));END IF;END$$DELIMITER ;
- 触发器3:删除操作后记录日志
从employees表中删除员工时,记录到日志里。
DELIMITER $$CREATE TRIGGER after_delete_employees
AFTER DELETE ON employees
FOR EACH ROW
BEGIN-- 插入审计日志INSERT INTO audit_log (employee_id, action, details)VALUES (OLD.id, 'DELETE', CONCAT('Deleted employee: ', OLD.name));END$$DELIMITER ;
查看触发器
SHOW TRIGGERS语句查看触发器信息
- 使用命令
SHOW TRIGGERS
查看触发器
SHOW TRIGGERS;
triggers
表中查看触发器信息
- 在MySQL中,所有触发器的定义都存在
INFORMATION_SCHEMA
数据库的TRIGGERS
表格中,可以通过查询命令SELECT
来查看。 - 查询INFORMATION_SCHEMA表:
SELECT * FROM INFORMATION_SCHEMA.TRIGGERS WHERE TRIGGER_SCHEMA = 'your_database_name';
- 查询数据库sys的触发器信息
SELECT * FROM INFORMATION_SCHEMA.TRIGGERS WHERE TRIGGER_SCHEMA = 'sys';
+-----------------+----------------+----------------------------+--------------------+----------------------+---------------------+--------------------+--------------+------------------+-----------------------------------------------------------------------------------------------------------------------------------+--------------------+---------------+----------------------------+----------------------------+--------------------------+--------------------------+------------------------+-----------------------------------------------------------------------------------------------------------------------+---------------------+----------------------+----------------------+--------------------+
| TRIGGER_CATALOG | TRIGGER_SCHEMA | TRIGGER_NAME | EVENT_MANIPULATION | EVENT_OBJECT_CATALOG | EVENT_OBJECT_SCHEMA | EVENT_OBJECT_TABLE | ACTION_ORDER | ACTION_CONDITION | ACTION_STATEMENT | ACTION_ORIENTATION | ACTION_TIMING | ACTION_REFERENCE_OLD_TABLE | ACTION_REFERENCE_NEW_TABLE | ACTION_REFERENCE_OLD_ROW | ACTION_REFERENCE_NEW_ROW | CREATED | SQL_MODE | DEFINER | CHARACTER_SET_CLIENT | COLLATION_CONNECTION | DATABASE_COLLATION |
+-----------------+----------------+----------------------------+--------------------+----------------------+---------------------+--------------------+--------------+------------------+-----------------------------------------------------------------------------------------------------------------------------------+--------------------+---------------+----------------------------+----------------------------+--------------------------+--------------------------+------------------------+-----------------------------------------------------------------------------------------------------------------------+---------------------+----------------------+----------------------+--------------------+
| def | sys | sys_config_insert_set_user | INSERT | def | sys | sys_config | 1 | NULL | BEGINIF @sys.ignore_sys_config_triggers != true AND NEW.set_by IS NULL THENSET NEW.set_by = USER();END IF;
END | ROW | BEFORE | NULL | NULL | OLD | NEW | 2024-12-25 19:56:15.08 | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION | mysql.sys@localhost | utf8mb4 | utf8mb4_0900_ai_ci | utf8mb4_0900_ai_ci |
| def | sys | sys_config_update_set_user | UPDATE | def | sys | sys_config | 1 | NULL | BEGINIF @sys.ignore_sys_config_triggers != true AND NEW.set_by IS NULL THENSET NEW.set_by = USER();END IF;
END | ROW | BEFORE | NULL | NULL | OLD | NEW | 2024-12-25 19:56:15.09 | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION | mysql.sys@localhost | utf8mb4 | utf8mb4_0900_ai_ci | utf8mb4_0900_ai_ci |
+-----------------+----------------+----------------------------+--------------------+----------------------+---------------------+--------------------+--------------+------------------+-----------------------------------------------------------------------------------------------------------------------------------+--------------------+---------------+----------------------------+----------------------------+--------------------------+--------------------------+------------------------+-----------------------------------------------------------------------------------------------------------------------+---------------------+----------------------+----------------------+--------------------+
2 rows in set (0.00 sec)
删除触发器
- 使用
DROP TRIGGER
语句可以删除MySQL中已经定义的触发器。
DROP TRIGGER IF EXISTS trigger_name;
综合案例——触发器使用
以下是一个简单的触发器案例,可以帮助我们快速学习触发器的基础命令!!!
步骤1:创建persons表
CREATE TABLE persons (name VARCHAR(40), num int);
Query OK, 0 rows affected (0.04 sec)
步骤2:创建一个销售额表sales
CREATE TABLE sales (name VARCHAR(40), sum int);
Query OK, 0 rows affected (0.04 sec)
步骤3:创建一个触发器
CREATE TRIGGER num_sum AFTER INSERT ON persons FOR EACH ROW INSERT INTO sales VALUES (NEW.name,7*NEW.num);
Query OK, 0 rows affected (0.01 sec)
可以看到,这里创建的触发器是当在数据表
persons
中插入数据后,把列num
的数值乘以7之后,最后插入到表sales
中的列sum
步骤4:向persons表中插入记录
INSERT INTO persons VALUES ('xiaojie',20),('eason',49);
Query OK, 2 rows affected (0.02 sec)
Records: 2 Duplicates: 0 Warnings: 0
步骤5:查看表persons和 sales
- 查询表
persons
数据
SELECT * FROM persons;
+---------+------+
| name | num |
+---------+------+
| xiaojie | 20 |
| eason | 49 |
+---------+------+
2 rows in set (0.00 sec)
- 查询表
sales
数据
SELECT *FROM sales;
+---------+------+
| name | sum |
+---------+------+
| xiaojie | 140 |
| eason | 343 |
+---------+------+
2 rows in set (0.00 sec)
步骤6:查看触发器
SHOW TRIGGERS;
+---------+--------+---------+-------------------------------------------------+--------+------------------------+--------------------------------------------+----------------+----------------------+----------------------+--------------------+
| Trigger | Event | Table | Statement | Timing | Created | sql_mode | Definer | character_set_client | collation_connection | Database Collation |
+---------+--------+---------+-------------------------------------------------+--------+------------------------+--------------------------------------------+----------------+----------------------+----------------------+--------------------+
| num_sum | INSERT | persons | INSERT INTO sales VALUES (NEW.name,7*NEW.num) | AFTER | 2025-01-20 15:26:23.78 | STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION | root@localhost | utf8mb4 | utf8mb4_0900_ai_ci | utf8mb4_0900_ai_ci |
+---------+--------+---------+-------------------------------------------------+--------+------------------------+--------------------------------------------+----------------+----------------------+----------------------+--------------------+
1 row in set (0.01 sec)
本文有关mysql数据库触发器的使用先讲到这里,明天再见!!
主页:【练小杰的CSDN】😆
ℹ️欢迎各位在评论区踊跃讨论,积极提出问题,解决困惑!!!
⚠️若博客里的内容有问题,欢迎指正,我会及时修改!!
相关文章:

我在广州学Mysql 系列——触发器的使用
ℹ️大家好,我是练小杰,这周是春节前的最后一周了,现在一双手数都能数得过来了!! 本播客将学习MYSQL中触发器的相关概念以及基础命令~~ 回顾:👉【MYSQL视图相关例题】 数据库专栏👉【…...
【useCallback Hook】在多次渲染中缓存组件中的函数,避免重复创建函数
文章目录 什么是 useCallback?基本语法 为什么需要 useCallback?示例1. 避免子组件重复创建函数2. 作为 useEffect 的依赖项 注意事项总结 在 React 开发中,性能优化是一个重要的主题。随着应用规模的增长,组件的重新渲染可能会变…...

2025/1/20 学习Vue的第三天
玩性太大了玩得也不开心,天天看电视刷视频。 内心实在空洞。 最近天天看小红书上的外国人,结实外国友人(狗头)哈哈哈认识了不少人,有埃及的有美国的,还有天天看菲利普吃糖葫芦哈哈哈哈哈一个阳光的德国大男…...

Kotlin Bytedeco OpenCV 图像图像49 仿射变换 图像裁剪
Kotlin Bytedeco OpenCV 图像图像49 仿射变换 图像裁剪 1 添加依赖2 测试代码3 测试结果 在OpenCV中,仿射变换(Affine Transformation)和透视变换(Perspective Transformation)是两种常用的图像几何变换方法。 变换方…...

金融项目实战 07|Python实现接口自动化——连接数据库和数据清洗、测试报告、持续集成
目录 一、投资模块(投资接口投资业务) 二、连接数据库封装 和 清洗数据 1、连接数据库 2、数据清洗 4、调用 三、批量执行测试用例 并 生成测试报告 四、持续集成 1、代码上传gitee 2、Jenkin持续集成 一、投资模块(投资接口投资业务…...

(快速入门)保姆级详细的 Midjourney 基础教程
一、前言篇 1. 1. AI 绘图是什么? AI 绘画,顾名思义就是利用人工智能进行绘画,是人工智能生成内容(AIGC)的一个应用场景。其主要原理简单来说就是收集大量已有作品数据,通过算法对它们进行解析,最后再生成新作品,而算法也便是 AI 绘画的核心,是它得以爆火的基础…...
leetcode——找到字符串中所有字母异位词(java)
给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。 示例 1: 输入: s "cbaebabacd", p "abc" 输出: [0,6] 解释: 起始索引等于 0 的子串是 "cba", 它是 "…...

大文件上传服务-后端V1V2
文章目录 大文件上传概述:minio分布式文件存储使用的一些技术校验MD5的逻辑 uploadV1 版本 1uploadv2 版本 2 大文件上传概述: 之前项目做了一个文件上传的功能,最近看到有面试会具体的问这个上传功能的细节,把之前做的项目拿过来总结一下,自己写的一个…...

Single-Model and Any-Modality for Video Object Tracking——2024——cvpr-阅读笔记
Single-Model and Any-Modality for Video Object Tracking 摘要相关工作创新处MethodShared embeddingModal promptingRGB Tracker based on TransformerOverall ExperiimentDatasetRGB-D samples are sourced from DepthTrackRGB-T samples are extracted from LasHeRRGB-E s…...

阳振坤:AI 大模型的基础是数据,AI越发达,数据库价值越大
2024年1月12日,第四届OceanBase数据库大赛决赛在北京圆满落幕。在大赛的颁奖典礼上,OceanBase 首席科学家阳振坤老师为同学们献上了一场主题为“爱上数据库”的公开课,他不仅分享了个人的成长历程,还阐述了对数据库行业现状与未来…...
Linux磁盘空间不足,12个详细的排查方法
在Linux系统运维过程中,磁盘空间不足是一个常见且棘手的问题。当磁盘空间被占满时,系统的正常运行会受到影响,甚至可能导致服务中断。因此,迅速有效地排查和解决磁盘空间问题显得尤为重要。本文将详细介绍16个排查Linux磁盘空间问…...

Spring Web MVC综合案例
承接上篇文章——Spring Web MVC探秘,在了解Spring Web MVC背后的工作机制之后,我们接下来通过三个实战项目,来进一步巩固一下前面的知识。 一、计算器 效果展示:访问路径:http://127.0.0.1:8080/calc.html 前端代码&a…...

微软预测 AI 2025,AI Agents 重塑工作形式
1月初,微软在官网发布了2025年6大AI预测,分别是:AI模型将变得更加强大和有用、AI Agents将彻底改变工作方式、AI伴侣将支持日常生活、AI资源的利用将更高效、测试与定制是开发AI的关键以及AI将加速科学研究突破。 值得一提的是,微…...
lvgl性能调优
LV_USE_PERFORMANCE lvgl_performance 是 LVGL 提供的性能分析工具,可以帮助开发者评估和优化图形库的性能。在一些特定的版本中,lvgl_performance 是一个宏或者工具,用来分析性能瓶颈,特别是图形渲染的效率。 下面是如何使用 l…...

CSS实现实现票据效果 mask与切图方式
一、“切图”的局限性 传统的“切图”简单暴力,但往往缺少适应性。 适应性一般有两种,一是尺寸自适应,二是颜色可以自定义。 举个例子,有这样一个优惠券样式 关于这类样式实现技巧,之前在这篇文章中有详细介绍: CSS 实现优惠券的技巧 不过这里略微不一样的地方是,两个…...

STL--list(双向链表)
目录 一、list 对象创建 1、默认构造函数 2、初始化列表 3、迭代器 4、全0初始化 5、全值初始化 6、拷贝构造函数 二、list 赋值操作 1、赋值 2、assign(迭代器1,迭代器2) 3、assign(初始化列表) 4、assig…...
ZooKeeper 中的 ZAB 一致性协议与 Zookeeper 设计目的、使用场景、相关概念(数据模型、myid、事务 ID、版本、监听器、ACL、角色)
参考Zookeeper 介绍——设计目的、使用场景、相关概念(数据模型、myid、事务 ID、版本、监听器、ACL、角色) ZooKeeper 设计目的、特性、使用场景 ZooKeeper 的四个设计目标ZooKeeper 可以保证如下分布式一致性特性ZooKeeper 是一个典型的分布式数据一致…...
“深入浅出”系列之C++:(11)推荐一些C++的开源项目
1. SQLiteCpp - 简单易用的Sqlite C封装库 仓库地址:https://github.com/SRombauts/SQLiteCpp 简介:SQLiteCpp是一个对Sqlite数据库进行C封装的开源库,代码行数约2,500行。它提供了简洁易用的接口,使得在C项目中操作Sqlite数据库…...
《重生到现代之从零开始的C++生活》—— 类和对象2
类的默认成员函数 默认成员函数就是用户没有显示实现,编译器会自动生成的成员函数,一个类会默认生成6个成员函数 构造函数 构造函数时特殊的成员函数,构造函数的初始化对象 函数名与类名相同 没有返回值 对象实例化的时候胡自动调用构造…...
“UniApp的音频播放——点击视频进入空白+解决视频播放器切换视频时一直加载的问题”——video.js、video-js.css
今天,又解决了一个单子“UniApp的音频播放——点击视频进入空白解决视频播放器切换视频时一直加载的问题” 一、问题描述 在开发一个基于 video.js 的视频播放器时,用户通过上下滑动切换视频时,视频一直处于加载状态,无法正常播放…...
后进先出(LIFO)详解
LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子(…...

测试微信模版消息推送
进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...
【网络】每天掌握一个Linux命令 - iftop
在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...

从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...

【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...
Java入门学习详细版(一)
大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...