MySQL学习之触发器

文章目录

  • 前言
  • 什么是触发器(Trigger)?
    • 触发器的特点
  • MySQL中触发器的用法
    • 创建
    • NEW 与 OLD
    • 举例
    • 其他操作
  • 注意事项
  • 后续内容
  • 参考目录


前言

阅读本文前请注意最后编辑时间,文章内容可能与目前最新的技术发展情况相去甚远。欢迎各位评论与私信,指出错误或是进行交流等。


什么是触发器(Trigger)?

触发器(Trigger)是数据库中的一种特殊存储程序,它绑定到某张表(或视图)上,并在特定的数据库操作(如 INSERT、UPDATE 或 DELETE)发生时自动执行预定义的操作。触发器无需手动调用,是一种事件驱动的机制。

触发器的特点

  1. 自动执行:一旦满足触发条件,触发器会在相关操作执行之前或之后自动运行。

  2. 绑定表:每个触发器都与特定的表绑定,只对该表的操作有效。

  3. 触发器类型包括:
    AFTER DELETE:在删除数据之后执行。
    BEFORE DELETE:在删除数据之前执行。
    AFTER UPDATE:在更新数据之后执行。
    BEFORE UPDATE:在更新数据之前执行。
    AFTER INSERT:在插入数据之后执行。
    BEFORE INSERT:在插入数据之前执行。

  4. 适用范围:
    触发器作用于每一行操作(FOR EACH ROW),或是整个语句的操作(FOR EACH STATEMENT,但在 MySQL 中不支持)。

MySQL中触发器的用法

创建

DELIMITER $$CREATE TRIGGER trigger_name { BEFORE | AFTER } { INSERT | UPDATE | DELETE }
ON table_name FOR EACH ROW
BEGIN执行语句
END $$DELIMITER ;

NEW 与 OLD

MySQL中定义了NEW和OLD,用来表示触发器的所在表中,触发了触发器的那一行数据。引用触发器中发生变化的记录内容,具体地:

触发器类型触发器类型NEW和OLD的使用
INSERT型触发器NEW表示将要或者已经新增的数据
UPDATE型触发器OLD表示修改之前的数据,NEW表示将要或已经修改后的数据
DELETE 型触发器OLD表示将要或者已经删除的数据

使用方法:
NEW.columnName (columnName为相应数据表某一列名)
OLD.columnName

举例

下面是一个用于清理数据的触发器代码示例,为了使大家更好的理解触发器的使用,下面将为大家分析每句代码的作用以及使用方法。

(题目:在社区表community中,当新增新的小区后;触发事件为当前新增小区这个insert操作。当新增小区楼栋数量 大于20栋 且 住户不低于150人,则在访客记录表manual_record中 删除 离开时间(out_time)距现在是一年以前 且 所有已离开的访客记录 (is_leave=1))

DELIMITER $$
​
CREATE TRIGGER update_is_leave_cleanup
AFTER INSERT ON community
FOR EACH ROW
BEGIN-- 检查新增小区楼栋数量是否 大于20栋 且 住户是否不低于150人IF NEW.term_count > 20 AND NEW.per_count >= 150 THEN-- 删除所有离开时间超过一年的访客记录DELETE FROM manual_recordWHERE is_leave = 1AND out_time < DATE_SUB(NOW(), INTERVAL 1 YEAR);END IF;
END$$
​
DELIMITER ;

CREATE TRIGGER update_is_leave_cleanup:创建一个名为 update_is_leave_cleanup 的触发器。
AFTER INSERT:表示在 community表执行 INSERT操作后触发该触发器。
ON community:触发器绑定到 community表。
FOR EACH ROW:触发器对 insert 操作的每一行都生效(逐行触发)。
BEGIN 和 END 标志触发器主体,表示触发器的逻辑操作。

 -- 检查新增小区楼栋数量是否 大于20栋 且 住户是否不低于150人IF NEW.term_count > 20 AND NEW.per_count >= 150 THEN
  • NEW.字段名:表示插入的新值。
  • 条件含义:
    检查新增小区楼栋数量是否 大于20栋 且 住户是否不低于150人。
    如果 NEW.term_count > 20 且 NEW.per_count >= 150,说明当前新增记录符合条件。
DELETE FROM manual_record
WHERE is_leave = 1AND out_time < DATE_SUB(NOW(), INTERVAL 1 YEAR);
  • 条件 1:is_leave = 1:
    仅删除已经离开的记录。

  • 条件 2:out_time < DATE_SUB(NOW(), INTERVAL 1 YEAR):
    out_time 是记录的离开时间。
    DATE_SUB(NOW(), INTERVAL 1 YEAR) 计算当前时间减去 1 年的日期。
    如果 out_time 早于一年前,则认为该记录已过期,删除之。

 END IF; 结束条件语句。END $$ 标志触发器逻辑结束。DELIMITER $$ 重置分隔符

其他操作

# 查看触发器
show triggers;# 删除触发器
drop trigger if exists trigger_name;# 需要注意的是,MySQL 不支持直接禁用单个触发器,但可以通过禁用整个表的触发器来达到类似的效果。
# 禁用所有触发器(全局禁用)
SET GLOBAL DISABLE_TRIGGERS = 1;# 启用所有触发器(全局启用)
SET GLOBAL DISABLE_TRIGGERS = 0;

注意事项

  • 触发器性能:如果表数据量大,使用触发器可能会影响性能。假设触发器每次执行花费1s, insert table 500条数据,那么就需要触发500次触发器,光是触发器执行的时间就花费了500s,而insert500条数据一共是1s,那么这个insert的效率就非常低了。

  • 事务支持:如果 UPDATE 操作失败,触发器逻辑也不会执行。

  • 调试触发器:可以通过启用 MySQL 日志或手动检查数据变化来调试触发器。

  • 数据备份:删除记录操作是不可逆的,在执行触发器前确保数据已备份。

  • MYSQL中触发器中不能对本表进行insert,update,delete操作,以免递归循环触发

  • 触发器是针对每一行的;在增删改非常频繁的表上使用触发器会非常消耗资源。

后续内容

关于MySQL已经是非常成熟的技术了,且优秀的博文和视频非常之多,所以就不打算做重复的工作。贴一些优秀的内容共同学习即可

MySQL索引:https://blog.csdn.net/justry_deng/article/details/81458470
https://blog.csdn.net/qq_35190492/article/details/109257302
https://blog.csdn.net/2401_85373732/article/details/145061201

MySQL事务:https://blog.csdn.net/weixin_58376680/article/details/136993032
https://blog.csdn.net/qq_56880706/article/details/122653735

MySQL锁:https://blog.csdn.net/qq_44700578/article/details/139912042

MySQL优化:https://blog.csdn.net/yuan2019035055/article/details/122310447(SQL优化、索引优化、锁机制、主从复制)
https://blog.csdn.net/xiaofeng10330111/article/details/105360974(索引优化)


参考目录

https://www.bilibili.com/video/BV1iF411z7Pu
https://blog.csdn.net/Future_yzx/article/details/144633142
https://blog.csdn.net/weixin_42571280/article/details/141650739

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/pingmian/84316.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AIGC 基础篇 Python基础 04 for循环与while循环

今天&#xff0c;我们来讲Python里面的循环部分 1.for循环 for i in range(1,10,2):print(i) 这是一个简单但是完整的for循环&#xff0c;里面包含了for循环的所有结构 首先注意格式是“for 变量 in range(取得到的起始值&#xff0c;取不到的终点值&#xff0c;步长)” …

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件

在选煤厂、化工厂、钢铁厂等过程生产型企业&#xff0c;其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进&#xff0c;需提前预防假检、错检、漏检&#xff0c;推动智慧生产运维系统数据的流动和现场赋能应用。同时&#xff0c;…

每日算法 -【Swift 算法】三数之和最接近目标值

🚀 Swift 实现:三数之和最接近目标值(3Sum Closest) ✨ 前言 在算法学习过程中,经典的“三数之和”系列题目是很多人通往进阶路上的一道坎。今天我们来介绍其中一个非常实用的变种问题 —— 三数之和最接近目标值(3Sum Closest),并使用 Swift 实现一个高效的解法。 …

python打卡day50@浙大疏锦行

知识点回顾&#xff1a; resnet结构解析CBAM放置位置的思考针对预训练模型的训练策略 差异化学习率三阶段微调 ps&#xff1a;今日的代码训练时长较长&#xff0c;3080ti大概需要40min的训练时长 作业&#xff1a; 好好理解下resnet18的模型结构尝试对vgg16cbam进行微调策略 R…

虚幻引擎5-Unreal Engine笔记之SET节点的输出引脚获取设置后的最新变量值

虚幻引擎5-Unreal Engine笔记之SET节点的输出引脚获取设置后的最新变量值 code review! 一个变量的“SET”节点 retrieve 是动词&#xff0c;意思是“检索、获取、取回”。 retrieves 只是当主语是第三人称单数&#xff08;比如 he、she、it 或单个人/物&#xff09;时使用的…

编译原理实验 之 TINY 解释测试目标代码

文章目录 实验任务1任务2 本次的实验是在前三次TINYC的基础上的一个测试&#xff0c;所以完成前三次的实验是基础 编译原理 之 实验一 编译原理实验 之 Tiny C语言编译程序实验 语法分析 编译原理实验 之 TINY 之 语义分析&#xff08;第二次作业 首先将新的文件复制到先前的…

CanFestival移植到STM32G4

文章目录 一、准备工作二、软件配置三、移植CanFestival参考 一、准备工作 1、获取Canfestival源码 2、Python下载 3、wxPython下载 4、CanFestival字典生成 5、安装参考 Python2.7.15及wxPython2.8百度云盘下载地址&#xff1a;https://pan.baidu.com/s/1bRS403m4B31m4ovSJ-_…

iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈

在日常iOS开发过程中&#xff0c;性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期&#xff0c;开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发&#xff0c;但背后往往隐藏着系统资源调度不当…

第十三章 RTC 实时时钟

第十三章 RTC 实时时钟 目录 第十三章 RTC 实时时钟 1 RTC简介 1.1 主要特性 2 功能描述 2.1 概述 2.2 复位过程 2.3 读RTC寄存器 2.4 配置RTC寄存器 2.5 RTC标志的设置 3 RTC寄存器描述 3.1 RTC控制寄存器高位(RTC_CRH) 3.2 RTC控制寄存器低位(RTC_CRL) 3.3 RTC预…

618来了,推荐京东云服务器

2核2G3M,49元/1年,348元/3年 2核4G5M,149元/1年,518元/3年 4核8G5M,368元/1年,1468元/3年 8核16G5M,1258元/1年,3498元/3年 8核32G10M,1498元/1年,4268元/3年 活动地址&#xff1a;https://3.cn/2hT-F6AX

数据库逻辑删除,唯一性约束究极解决方案

文章目录 一、写在前面二、解决方案1、业务逻辑层面控制2、物理删除数据归档3、is_delete !0的都认为是删除&#xff08;推荐&#xff09;4、MySQL 函数索引&#xff08;表达式索引&#xff09;&#xff08;需 MySQL 8.0&#xff09;&#xff08;推荐&#xff09;5、部分索引&a…

3-存储系统

一-基本概念 二-主存储器 三-主存储器与CPU的连接 四-外部存储器 五-高速缓冲存储器 六-虚拟存储器

华为0528笔试

第三题 题目 给定一个二维数组 mountainMap 表示一座山的地图&#xff0c;数组中的每个元素 mountainMap[x][y] 代表坐标 (x, y) 处山的高度。登山员从山底出发&#xff0c;爬到山峰。 山底的含义&#xff1a;mountainMap中高度为0的坐标点。 山峰的含义&#xff1a;mountain…

Redis的过期策略和淘汰策略

Redis的过期策略和淘汰策略 想象一下周末的大型超市&#xff1a;生鲜区的酸奶贴着"今日特价"标签&#xff0c;促销员定时检查这些商品的保质期&#xff1b;而仓库管理员正根据"先进先出"原则整理货架&#xff0c;确保商品不会过期积压。这种高效的商品管理…

laravel8+vue3.0+element-plus搭建方法

创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …

【HarmonyOS 5】 影视与直播详以及 开发案例

&#x1f3a5; ‌一、超高清低延迟直播‌ ‌4K/8K硬解能力‌&#xff1a;通过鸿蒙媒体引擎实现15Mbps码率视频流稳定解码&#xff0c;华为Pura X实测端到端延迟<80ms‌分布式渲染‌&#xff1a;支持手机拍摄→智慧屏导播→平板监看的工作流协同&#xff0c;设备间传输延迟&…

Tunna工具实战:基于HTTP隧道的RDP端口转发技术

工具概述 Tunna是一款利用HTTP/HTTPS隧道进行TCP通信的渗透测试工具&#xff0c;由SECFORCE团队开发并开源。该工具主要应用于需要绕过防火墙限制的场景&#xff0c;通过Webshell实现内网服务的端口转发&#xff0c;特别适合在仅开放80/443端口的环境中建立TCP连接。 项目地址…

c# Autorest解析

AutoRest 工具生成用于访问 RESTful Web 服务的客户端库。AutoRest 的输入是使用 OpenAPI 规范格式描述 REST API 的规范。OpenAPI(f.k.a Swagger)规范代码生成器。支持 C#、PowerShell、Go、Java、Node.js、TypeScript、Python。 安装 AutoRest 在 Windows、MacOS 或 Linux …

高中数学联赛模拟试题精选学数学系列第24套几何题

⊙ O 1 \odot O_1 ⊙O1​ 和 ⊙ O 2 \odot O_2 ⊙O2​ 交于 A A A, B B B. Y Y Y 是 ⊙ O 1 \odot O_1 ⊙O1​ 上一点, Z Z Z 是 ⊙ O 2 \odot O_2 ⊙O2​ 上一点&#xff0c; Y Z YZ YZ 通过 A A A. 过 Y Y Y 的 ⊙ O 1 \odot O_1 ⊙O1​ 的切线和过 Z Z Z 的 ⊙…

【QT】INI格式文件读写类IniApi封装

【QT】INI文件读写类IniApi封装 前言实现INI文件写入方法INI文件读取方法 测试 前言 INI格式文件是一种纯文本格式&#xff0c;使用方括[]定义节&#xff08;Section&#xff09;&#xff0c;每个节下包含键值对&#xff0c;如下图所示。该格式文件简单易读易编辑。而且在所有…