第68讲:MySQL触发器的核心概念以及常见的触发类型应用案例
文章目录
- 1.触发器的概念
- 2.触发器操作的语法结构
- 3.各类触发器的典型应用案例
- 3.1.需求描述以及实现思路
- 3.2.创建日志表
- 3.3.INSERT类型的触发器
- 3.4.UPDATE类型的触发器
- 3.5.DELETE类型的触发器
1.触发器的概念
触发器是与表中数据相关的数据库对象,当表中的数据产生inster、update、delete这类操作时,可以通过触发器在这些动作之前或者之后,去完成相应的操作,例如向表中插入一条数据,插入数据之后通过触发器完成一些操作。
在触发器中会定义很多的SQL语句集合,当满足执行触发器的动作后,会执行触发器中的SQL语句。
触发器可以协助应用程序在数据库端确保数据的完整性、日志记录、数据校验等各种操作,触发器的最典型案例就是记录表中数据的操作日志,例如当增加一条数据时,就执行触发器中的逻辑,记录本次插入的数据内容到一张日志表中,当表中数据被修改后,就通过触发器在日志表中记录数据修改前后的内容,即使有误删除的情况下,也可以通过日志表快速恢复数据,同时也可以记录用户的行为。
可以使用触发器做一个类似回收站的功能,当产生DELETE语句时,将原数据写入到另外一张表,这张表就是回收站。
在触发器中有两类别名用来引用触发器中发生变化后的记录内容:
- OLD:记录触发器发生变化前的数据内容,也就是旧的数据内容。
- 例如我们对update操作设置了触发器,old会记录触发器发生变化前后的数据内容,通过old就可以引用update修改之前的数据内容。
- NEW:记录触发器发生变化后的数据内容,也就是新数据内容。
- 例如update的触发器,通过old会引用update之前的数据内容,同理,通过new就可以引用update之后的数据内容。
常见的触发器类型:
- INSERT类型触发器
- 在INSERT类型的触发器中,我们可以通过NEW别名来引用新增加的数据内容。
- UPDATE类型触发器
- 在UPDATE类型的触发器中,我们可以通过OLD引用数据修改前的内容,通过NEW来引用数据修改后的内容。
- DELETE类型触发器
- 在DELEET类型的触发器中,我们可以通过OLD来引用被删除的数据内容。
MySQL只支持行级触发器。
2.触发器操作的语法结构
创建触发器
CREATE TRIGGER 触发器名称
BEFORE/AFTER INSERT/UPDATE/DELETE #BEFORE数据变动之前 AFTER数据变动之后 INSERT/UPDATE/DELETE表示触发器类型
ON 要对那张表设置触发器 FOR EACH ROW #行级触发器
BEGINSQL语句
END
查看触发器
SHOW TRIGGERS
删除
DROP TRIGGER 触发器名称
3.各类触发器的典型应用案例
3.1.需求描述以及实现思路
通过触发器去监控xscjb表,针对表中数据的增删改三类操作,将变更的内容以日志的形式记录到xscjb_logs表中。
我们要针对表中数据的增删改三类都要进行日志记录,那么需要分别对这三类的操作定义一个触发器。
实现思路:
- 首先定义一张xscjb_logs表,用于记录xscjb表的增删改变更内容。
- 然后分别对增删改三种操作定义触发器,触发器的执行要在增删改之后再执行。
- 最后在触发器中定义SQL语句,通过insert语句将表数据变更前后的内容写入到日志表中,数据变更前的内容可以通过
old.字段的方式获取,数据变更后的内容可以通过new.字段的方式获取。插入数据的触发器只需要通过new别名来记录新数据的内容日志即可。
更新数据的触发器需要通过old记录更新前的数据内容,也要通过new记录更新后的数据内容,都写入到日志表。
删除数据的触发器只需要通过old来记录数据删除前的内容即可。
3.2.创建日志表
在日志表中可以定义这些字段:
1)操作类型:记录该条日志是针对什么类型的操作触发的,如insert。
2)操作时间:记录数据变动的执行时间,
3)发生变动的数据在原表的主键内容:记录变动的数据在原表的主键字段的内容。
4)日志内容:记录数据变动前后的内容。
create table xscjb_logs(id int not null auto_increment,oper_type varchar(10) not null comment '操作类型',oper_time datetime not null comment '操作时间',data_id int not null comment '变动的数据在原表的主键id',oper_log varchar(500) comment '数据变动前后的内容',primary key (id)
)
3.3.INSERT类型的触发器
先来定义一个数据插入的触发器,当表中有数据插入时,通过INSERT类型的触发器,将插入的数据记录在日志表中。
1)创建触发器
create trigger xscjb_trigger_insert
after insert on xscjb for each row
begininsert into xscjb_logs (id,oper_type,oper_time,data_id,oper_log) values (null,'insert',now(),new.xh,concat('插入的数据内容为:xh=',new.xh,',xm=',new.xm,',ywcj=',new.ywcj,',sxcj=',new.sxcj,',yycj=',new.yycj));
end;
2)触发器每条语句的含义
create trigger xscjb_trigger_insert
after insert on xscjb for each row #after表示数据变动之后执行触发器,insert表示是插入类型的触发器,当表中数据插入完成后再执行触发器,针对xscjb的触发器
begin#整个触发器中只有一条SQL,那就是将变动的数据插入到日志表中insert into xscjb_logs (id,oper_type,oper_time,data_id,oper_log) #为日志表中每一个字段都写入内容values (null, #id字段不用写,id字段是主键,并且自增,无需填写内容'insert', #操作类型字段填写insert即可,表示这是INSTER触发器产生的日志now(), #操作时间字段可以通过now函数自动填写当前的日期时间new.xh, #data_id字段要记录数据在原表的主键字段值,数据变动之后的内容都记录在new别名中,当然也可以使用old,但是insert语句没有old别名,因此我们可以通过引用new别名+指定的字段来读取数据变动后,该字段的内容,将读取到的主键内容写入到data_id字段concat('插入的数据内容为:xh=',new.xh,',xm=',new.xm,',ywcj=',new.ywcj,',sxcj=',new.sxcj,',yycj=',new.yycj)#操作日志字段主要记录数据变动前后的内容,由于是inster类型的触发器,只记录数据变动后新增的内容,作为日志内容即可,通过concat字符串拼接函数将内容形成一段话,然后将变动的每个字段值通过new别名进行引用,就可以拿到数据变动后的新内容);
end;
3)向xscjb表写入数据,观察日志表是否有数据产生
为了更加直观,可以写入多条数据。
insert into xscjb values (NULL,'小江','88','77','66');
当xscjb这张表有数据插入,那么日志表就会通过触发器产生对应的inster日志,在data_id字段可以看到那条数据发生了数据变动,在oper_log字段可以看到具体的数据变更动作和变更的数据内容。

3.4.UPDATE类型的触发器
INSTER类型的触发器定义完毕了,当有数据产生时,就会将产生的数据内容和动作记录在日志表里,下面来定义UPDATE类型的触发器,当有数据发生了变化,就将数据更新的前后内容都记录在日志表中。
1)创建触发器
create trigger xscjb_trigger_update
after update on xscjb for each row
begininsert into xscjb_logs (id,oper_type,oper_time,data_id,oper_log) values (null,'update',now(),old.xh,concat('更新前的数据内容:xh=',old.xh,',xm=',old.xm,',ywcj=',old.ywcj,',sxcj=',old.sxcj,',yycj=',old.yycj,' 更新后的数据内容:xh=',new.xh,',xm=',new.xm,',ywcj=',new.ywcj,',sxcj=',new.sxcj,',yycj=',new.yycj));
end;
2)触发器每条语句的含义
触发器和INSERT类型的触发器语法结构一样,只不过改了几个关键字,对日志的内容增加了更加详细的内容。
create trigger xscjb_trigger_update
after update on xscjb for each row #update类型的触发器要将第二个关键字设置为update
begininsert into xscjb_logs (id,oper_type,oper_time,data_id,oper_log) values (null,'update', #操作类型改为updatenow(),old.xh, #这里要记录原始数据的主键值,由于是update类型,面向的是旧数据,因此通过old别名获取数据的主键值concat('更新前的数据内容:xh=',old.xh,',xm=',old.xm,',ywcj=',old.ywcj,',sxcj=',old.sxcj,',yycj=',old.yycj,' 更新后的数据内容:xh=',new.xh,',xm=',new.xm,',ywcj=',new.ywcj,',sxcj=',new.sxcj,',yycj=',new.yycj)#update语句会通过old别名记录更新前的数据,通过new记录更后的数据,为了方便查看,我们可以在操作日志中记录update更数据前后的数据内容,更新前通过old别名引用获取指定字段的数据,更新后通过new别名引用获取指定字段的数据);
end;
3)更新xscjb表中的数据观察日志表
update xscjb set ywcj = '100' where xm = '小黑';
当xscjb表的数据发生更改时,xscjb_trigger_update触发器就会向日志表中写入一条数据,记录数据更新前后的内容。

3.5.DELETE类型的触发器
最后我们再来定义一个DELETE类型的触发器,当表中数据删除后,在日志表中记录被删除的数据内容。
1)创建触发器
create trigger xscjb_trigger_delete
after delete on xscjb for each row
begininsert into xscjb_logs (id,oper_type,oper_time,data_id,oper_log) values (null,'delete', now(),old.xh,concat('删除的数据内容:xh=',old.xh,',xm=',old.xm,',ywcj=',old.ywcj,',sxcj=',old.sxcj,',yycj=',old.yycj));
end;
2)触发器每条语句的含义
create trigger xscjb_trigger_delete
after delete on xscjb for each row #delete类型的触发器要将第二个关键字设置为delete
begininsert into xscjb_logs (id,oper_type,oper_time,data_id,oper_log) values (null,'delete', #操作类型改为deletenow(),old.xh, #这里要记录原始数据的主键值,由于是delete类型,面向的是旧数据,因此通过old别名获取数据的主键值concat('删除的数据内容:xh=',old.xh,',xm=',old.xm,',ywcj=',old.ywcj,',sxcj=',old.sxcj,',yycj=',old.yycj)); #最后将日志内容稍加变动即可
end;
3)删除多条数据观察日志表的记录
delete from xscjb where xh > '9';
删除的条件是xh大于9的,数据删除完成后,在日志表中会记录被删除的数据。

相关文章:
第68讲:MySQL触发器的核心概念以及常见的触发类型应用案例
文章目录 1.触发器的概念2.触发器操作的语法结构3.各类触发器的典型应用案例3.1.需求描述以及实现思路3.2.创建日志表3.3.INSERT类型的触发器3.4.UPDATE类型的触发器3.5.DELETE类型的触发器 1.触发器的概念 触发器是与表中数据相关的数据库对象,当表中的数据产生in…...
VS Code 开发 Spring Boot 类型的项目
在VS Code中开发Spring Boot的项目, 可以导入如下的扩展: Spring Boot ToolsSpring InitializrSpring Boot Dashboard 比较建议的方式是安装Spring Boot Extension Pack, 这里面就包含了上面的扩展。 安装方式就是在扩展查找 “Spring Boot…...
数据中心加密:保障数据安全的重要一环
随着信息化的快速发展,数据已经成为企业的重要资产,数据安全也成为了企业面临的重大挑战。数据中心作为企业数据存储和管理的重要场所,其安全性对于整个企业的数据安全具有至关重要的作用。而数据中心加密则是保障数据安全的重要一环。本文将…...
分享90个节日庆典PPT,总有一款适合您
分享90个节日庆典PPT,总有一款适合您 PPT下载链接:百度网盘 请输入提取码 提取码:8888 Python采集代码下载链接:采集代码.zip - 蓝奏云 学习知识费力气,收集整理更不易。知识付费甚欢喜,为咱码农谋福利…...
Python Faker批量生成测试数据
一、前言 在做自动化测试或压力测试时会需要大批量生成测试数据,简单的方式你可以写一个存储过程使用随机函数来生成记录,但这种生成数据看起来不够真实,其实有蛮多现成的工具可以完成这一任务。 二、Faker基本使用介绍 faker是一个生成伪…...
Docker-compose 运行MySQL 连接不上
Docker-compose 运行MySQL 连接不上 📔 千寻简笔记介绍 千寻简笔记已开源,Gitee与GitHub搜索chihiro-notes,包含笔记源文件.md,以及PDF版本方便阅读,且是用了精美主题,阅读体验更佳,如果文章对你有帮助请帮我点一个Star~ 更新:支持在线阅读文章,根据发布日期分类…...
Educational Codeforces Round 2 D 计算几何
题目链接:Educational Codeforces Round 2 D 题目 给你两个圆。求它们相交处的面积。 输入 第一行包含三个整数 x1, y1, r1 ( - 109 ≤ x1, y1 ≤ 109, 1 ≤ r1 ≤ 109 ) - 第一个圆的圆心位置和半径。 第二行包含三个整数 x2, y2, r2 ( …...
hexo博客发布换电脑换地方了怎么办?
假如你有2台MacBook,一台在家,一台在公司。在家的hexo本地环境都搭好了,markdown文件等等也都放在本地source下的_posts文件夹里了。但是我过2天又想有个新文章发布,这时候电脑在公司,那么该怎么办? 把家里…...
最新知识付费变现小程序源码/独立后台知识付费小程序源码/修复登录接口
最新知识付费变现小程序源码,独立后台知识付费小程序源码,最新版修复登录接口。 主要功能 会员系统,用户登录/注册购买记录 收藏记录 基本设置 后台控制导航颜色 字体颜色 标题等设置 流量主广告开关小程序广告显示隐藏 广告主审核过审核…...
奥威BI软件 | 职场人的数据可视化救星
对时间紧张、工作繁重的职场人来说,一款易学易用、效率高、数据展现直观的数据可视化软件必不可少。奥威BI软件就是这样一款数据可视化软件,零编程开发报表,不需要额外多花时间,即可点击、拖拉拽完成数据分析、报表制作࿰…...
最长公共前缀[简单]
优质博文:IT-BLOG-CN 一、题目 编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串""。 示例 1: 输入:strs ["flower","flow","flight"] 输出…...
Java后端开发(十一)-- Mysql8的详细安装与环境配置
目录 1. mysql数据库下载 官网在线下载 2. 下载 MySQL的安装包 3. 安装MySQL...
什么是Spring?什么是IOC?什么是DI?IOC和DI的关系? —— 零基础可无压力学习,带源码
🧸欢迎来到dream_ready的博客,📜相信您对这几篇博客也感兴趣o (ˉ▽ˉ;) 📜什么是SpringMVC?简单好理解!什么是应用分层?SpringMVC与应用分层的关系? 什么是三层架构&…...
PyTorch 从tensor.grad 看 backward(权重参数) 和 gradient accumulated
1. 新建一个自变量 tensor x import torchx torch.ones(1, requires_gradTrue) print(x)1. 输出: tensor([1.], requires_gradTrue)2. 写一个 forward import torchx torch.ones(1, requires_gradTrue) y x**2 z x**33. y, z 都 backward import torchx to…...
fedora 命令行代理proxychains 使用flatpak下载 flathub包
feodra 28 有 tsocks - (rpm 包)工具, 后面就没有了. 不过还有替代工具 proxychains 当前操作环境 Fedora 38 proxychains 配置文件所在位置 # 全局配置 /etc/proxychains.confproxychains looks for configuration in the following order: SOCKS5 proxy port in environme…...
介绍kamailio的dialog模块
# 介绍kamailio的dialog模块 kamailio的dialog模块一般有四个作用: - 读写对话变量 - 跟uac模块配合,完成uac trunk auth功能 - 统计early_dialogs和active_dialogs等 - 利用dialog profile实现分类统计功能或者实现呼叫限制功能 dialog模块的参数可以…...
性能优于BERT的FLAIR:一篇文章入门Flair模型
文章目录 What is FLAIR?FLAIR ModelContextual String Embedding for Sequence Labelingexample FLAIR Application AreaSentiment AnalysisNamed Entity RecognitionText Classification FLAIR一、什么是FLAIR?二、FLAIR Library的优势是什么ÿ…...
Weblogic ssrf漏洞复现
文章目录 一、漏洞描述二、漏洞特征1.查看uddiexplorer应用2.漏洞点 三、漏洞复现1.获取容器内网ip2.VULHUB Weblogic SSRF漏洞 docker中 centos6 无法启动的解决办法3.准备payload4.反弹shell 一、漏洞描述 SSRF 服务端请求伪造(Server-Side Request Forgery),是一种由攻击者…...
Memcached构建缓存服务器
Memcache介绍 1、特点 内置存储方式----------为了提高性能,memcached中保存的数据都存储在memcache内置的内存存储空间中。由于数据仅存在于内存中,重启操作系统会导致全部数据消失 简单key/value存储--------------服务器不关心数据本身的意义及结构&…...
vue3+element Plus实现弹框的拖拽、可点击底层页面功能
1、template部分 <el-dialog:modal"false"v-model"dialogVisible"title""width"30%"draggable:close-on-click-modal"false"class"message-dialog"> </el-dialog> 必须加的属性 modal:是否去掉遮罩层…...
页面渲染流程与性能优化
页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...
相机从app启动流程
一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...
Linux-07 ubuntu 的 chrome 启动不了
文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...
GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...
【 java 虚拟机知识 第一篇 】
目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...
自然语言处理——文本分类
文本分类 传统机器学习方法文本表示向量空间模型 特征选择文档频率互信息信息增益(IG) 分类器设计贝叶斯理论:线性判别函数 文本分类性能评估P-R曲线ROC曲线 将文本文档或句子分类为预定义的类或类别, 有单标签多类别文本分类和多…...
UE5 音效系统
一.音效管理 音乐一般都是WAV,创建一个背景音乐类SoudClass,一个音效类SoundClass。所有的音乐都分为这两个类。再创建一个总音乐类,将上述两个作为它的子类。 接着我们创建一个音乐混合类SoundMix,将上述三个类翻入其中,通过它管理每个音乐…...
ffmpeg(三):处理原始数据命令
FFmpeg 可以直接处理原始音频和视频数据(Raw PCM、YUV 等),常见场景包括: 将原始 YUV 图像编码为 H.264 视频将 PCM 音频编码为 AAC 或 MP3对原始音视频数据进行封装(如封装为 MP4、TS) 处理原始 YUV 视频…...
window 显示驱动开发-如何查询视频处理功能(三)
D3DDDICAPS_GETPROCAMPRANGE请求类型 UMD 返回指向 DXVADDI_VALUERANGE 结构的指针,该结构包含特定视频流上特定 ProcAmp 控件属性允许的值范围。 Direct3D 运行时在D3DDDIARG_GETCAPS的 pInfo 成员指向的变量中为特定视频流的 ProcAmp 控件属性指定DXVADDI_QUER…...
