MySQL之触发器相关操作

news2025/1/18 9:02:31

1. 概念

触发器,就是⼀种特殊的存储过程。触发器和存储过程⼀样是⼀个能够完成特定功能、存储
在数据库服务器上的SQL⽚段,但是触发器⽆需调⽤,当对数据表中的数据执⾏DML操作时
⾃动触发这个SQL⽚段的执⾏,⽆需⼿动调⽤。
在MySQL,只有执⾏insert\delete\update操作才能触发触发器的执⾏

2. 触发器的使用

2.0 数据源

-- ----------------------------
-- Table structure for students
-- ----------------------------
DROP TABLE IF EXISTS `students`;
CREATE TABLE `students`  (
  `stu_num` char(4) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
  `stu_name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
  `stu_gender` char(2) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
  `stu_age` int(11) NOT NULL,
  PRIMARY KEY (`stu_num`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of students
-- ----------------------------
INSERT INTO `students` VALUES ('1001', '张三', '男', 20);
INSERT INTO `students` VALUES ('1002', '李四', '男', 20);
INSERT INTO `students` VALUES ('1003', '王五', '男', 20);

-- ----------------------------
-- Table structure for stulogs
-- ----------------------------
DROP TABLE IF EXISTS `stulogs`;
CREATE TABLE `stulogs`  (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `time` timestamp(0) NULL DEFAULT NULL,
  `log_text` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

2.1 创建触发器

-- 语法格式
create trigger 触发器名字 
before/after 				-- 触发时机
insert/delete/update		-- 定义DML类型
ON 表名			
for each row				-- 声明为行级触发器(只要操作一条记录,就触发触发器执行一次)
sql_statment;				-- 触发器操作
-- 创建触发器:当向学生信息表进行添加操作时,则向日志信息表中插入一条日志记录
create trigger trigger_test1
after insert on students
for each row
insert into stulogs(time, log_text) values(now(), concat('添加', NEW.stu_num,'学生信息')); 
-- 行级触发器, 插入2条记录, 则将会触发2次触发器
insert into students(stu_num, stu_name, stu_gender, stu_age) values('1005', '高三', '男', '32'), ('1006','赵八','男','33');

在这里插入图片描述

2.2 查看触发器

-- 查看触发器
show triggers;

在这里插入图片描述

2.3 删除触发器

-- 删除触发器
drop trigger trigger_test1;

2.4 NEW与OLD
触发器⽤于监听对数据表中数据的insert、 delete、 update操作,在触发器中通常处理⼀些DML的关联操作;我们可以使⽤ NEW 和 OLD 关键字在触发器中获取触发这个触发器的DML操作的数据。
NEW : 在触发器中⽤于获取insert操作添加的数据、 update操作修改后的记录。
OLD:在触发器中⽤于获取delete操作删除前的数据、 update操作修改前的数据。

2.4.1 NEW
(1)insert操作中

-- NEW表示新插入的学生的记录
create trigger trigger_test1
after insert on students
for each row
insert into stulogs(time, log_text) values(now(), concat('添加', NEW.stu_num,'学生信息')); 

在这里插入图片描述

(2)update操作中

-- 创建触发器:在监听update操作的触发器中,可以使用NEW获取修改后的记录
create trigger trigger_test2
after update on students
for each row
insert into stulogs(time, log_text) values(now(), concat('修改学生信息为', NEW.stu_num,NEW.stu_name)); 

在这里插入图片描述

2.4.2 OLD

(1)delete操作中

--  OLD表示删除的记录
create trigger trigger_test3
after delete on students
for each row 
insert into stulogs(time, log_text) values(now(), concat('删除', OLD.stu_num, '学生信息')); 
delete from students where stu_num=1005;

在这里插入图片描述

(2)update操作中

--  OLD表示修改前的记录
create trigger trigger_test4
after update on students
for each row 
insert into stulogs(time, log_text) values(now(), concat('将学生姓名从 ', OLD.stu_name, ' 修改为', NEW.stu_name)); 
update students set stu_name='王五五' where stu_num=1003;

在这里插入图片描述

3. 触发器初步总结

3.1 优点
(1)触发器是⾃动执⾏的,当对触发器相关的表执⾏响应的DML操作时⽴即执⾏;
(2)触发器可以实现表中的数据的级联操作(关联操作),有利于保证数据的完整性;
(3)触发器可以对DML操作的数据进⾏更为复杂的合法性校验。

3.2 缺点
(1)使⽤触发器实现的业务逻辑如果出现问题将难以定位,后期维护困难;
(2)⼤量使⽤触发器容易导致代码结构杂乱,增加了程序的复杂性;

(3)当触发器操作的数据量⽐较⼤时,执⾏效率会⼤⼤降低。

3.3 使用建议
(1)在互联⽹项⽬中,应避免适应触发器;
(2)对于并发量不⼤的项⽬可以选择使⽤存储过程,但是在互联⽹引⽤中不提倡使⽤存储过
程(原因:存储过程时将实现业务的逻辑交给数据库处理,⼀则增减了数据库的负载,
⼆则不利于数据库的迁移)。

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

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

相关文章

前端食堂技术周刊第 83 期:TS 5.1 RC、Nuxt 3.5、INP、Kinp、管理 GitHub 通知、WebXR

By Midjournery 美味值:🌟🌟🌟🌟🌟 口味:杏花乌龙拿铁 食堂技术周刊仓库地址:https://github.com/Geekhyt/weekly 本期摘要 TypeScript 5.1 RCNuxt 3.5INP 将成为新的 Core Web…

【LeetCode232】用栈模拟实现队列

你好,欢迎来到我的博客!作为一名程序员,我经常刷LeetCode题目来提升自己的编程能力。在我的博客里,我会分享一些我自己做过的题目和解题思路,希望能够帮助到大家。今天,我想和大家分享一道挑战性较高的题目…

【牛客刷题专栏】0x29:JZ31 栈的压入、弹出序列(C语言编程题)

前言 个人推荐在牛客网刷题(点击可以跳转),它登陆后会保存刷题记录进度,重新登录时写过的题目代码不会丢失。个人刷题练习系列专栏:个人CSDN牛客刷题专栏。 题目来自:牛客/题库 / 在线编程 / 剑指offer: 目录 前言问…

周赛346(括号匹配问题变形、双指针、模拟/打表预处理+DFS)

文章目录 周赛346[2696. 删除子串后的字符串最小长度](https://leetcode.cn/problems/minimum-string-length-after-removing-substrings/)暴力模拟使用栈 [2697. 字典序最小回文串](https://leetcode.cn/problems/lexicographically-smallest-palindrome/)双指针 [2698. 求一个…

开放原子训练营(第三季)inBuilder低代码开发实验室之低代码浪潮已至

目录 、前言: 一、为什么选择它 二、小试牛刀 3.1设计源数据 3.2设计页面 3.3发布应用 四、总结 、前言: 当你还在沉浸于AI和大数据浪潮带来的影响时,另一种低代码或0代码的编程方式在市场流行,截止至2023年,低代码的浪…

浅浅谈谈ssm的那些事儿外加AOP和DI+DAO思想的理解和处理json数据的第三方工具

MyBatis 一级缓存 默认是打开的 SqlSession级别的缓存,同一个SqlSession的发起多次同构查询,会将数据保存在一级缓存中。 在sqlsession 中有一个数据结构 是map 结构, 这个区域就是一级缓存区域,一级缓存区域中的 key 是由 sql 语…

11.Mysql内核语句优化规则详解

MySQL性能调优 1. 条件化简1.1 移动不必要的括号1.2 常量传递1.3 移动没用的条件1.4 表达式计算1.5 常量表检测 2. 外连接消除3. 子查询MySQL内部优化规则3.1 子查询语法3.1.1 按返回的结果集区分子查询标量子查询行子查询列子查询表子查询 3.1.2 按与外层查询关系来区分子查询…

20230522打开cv1826的buildroot的内核的早期打印的功能

20230522打开cv1826的buildroot的内核的早期打印的功能 在CV1826的buildroot启动的时候,有些内核打印/printk显示不了。 大概在内核时间3-4s秒钟的前后,有一段内核打印丢失了! 在CV1826的buildroot启动到uboot的时候,按ctrlC组合…

性能优化之思路和分析

、优化思路 尽可能减少首屏必须资源的体积尽可能提前首屏必须资源/接口的请求发起时机延后闲时预缓存非必要资源/请求 代码分离 https://webpack.docschina.org/guides/code-splitting/ 动态导入 https://webpack.docschina.org/guides/code-splitting/#dynamic-imports sp…

vector模拟

先来看看vector的源码&#xff0c;string没有看是因为string严格意义上来讲不属于STL。 源代码之间也是存在区别的&#xff0c;大同小异&#xff0c;可以去网上查如何下载STL的源码库。 先看看<vector>文件中的内容&#xff08;当做参考即可&#xff09;&#xff1a; 内容…

springboot服务端接口公网远程调试 - 实现HTTP服务监听【端口映射】

文章目录 前言1. 本地环境搭建1.1 环境参数1.2 搭建springboot服务项目 2. 内网穿透2.1 安装配置cpolar内网穿透2.1.1 windows系统2.1.2 linux系统 2.2 创建隧道映射本地端口2.3 测试公网地址 3. 固定公网地址3.1 保留一个二级子域名3.2 配置二级子域名3.2 测试使用固定公网地址…

【分布式系统】分布式锁实现之Redis

锁有资源竞争问题就有一定有锁的存在&#xff0c;存储系统MySQL中&#xff0c;有锁机制保证数据并发访问。而编程语言层面Java中有JUC并发工具包来实现&#xff0c;那么锁解决的问题是什么&#xff1f;主要是在多线程环境下&#xff0c;对共享资源的互斥。从而保证数据一致性。…

SVG在前端中的常见应用

SVG在前端中的常见应用 一、svg标签1. svg2. g 二、描边属性三、模糊和阴影效果1. 模糊2. 阴影效果 四、线性渐变和径向渐变1. 线性渐变2. 径向渐变 五、绘制1. 内置形状元素2. 绘制矩形3. 绘制圆形4. 绘制椭圆5. 绘制线条6. 绘制多边形7. 绘制多线条8. 绘制文本9. 绘制路径 只…

【C/C++】动态内存管理/泛型编程

&#x1f307;个人主页&#xff1a;平凡的小苏 &#x1f4da;学习格言&#xff1a;命运给你一个低的起点&#xff0c;是想看你精彩的翻盘&#xff0c;而不是让你自甘堕落&#xff0c;脚下的路虽然难走&#xff0c;但我还能走&#xff0c;比起向阳而生&#xff0c;我更想尝试逆风…

SQLlite教程(第一篇)

SQLlite教程(第一篇 SQLlite是什么?SQLlite工作原理是什么?SQLlite有什么功能和特性?使用SQLlite有哪些注意事项?附加资料 SQLlite是什么? SQLite&#xff0c;是一款轻型的数据库&#xff0c;是遵守ACID的关系型数据库管理系统&#xff0c;它包含在一个相对小的C库中。它是…

Mysql审核查询平台Archery部署

目录 1 Archery产品介绍2 基于docker搭建Archery2.1 系统环境2.2 安装 Docker2.2.1 安装 Docker Compose2.2.2 下载Archery2.2.3 安装并启动2.2.4 表结构初始化2.2.5 数据初始化2.2.6 创建管理用户2.2.7 退出重启2.2.8 日志查看和问题排查2.2.9 启动成功查看2.2.10 端口占用情况…

基于Maven的profiles多环境配置

一个项目通常都会有多个不同的运行环境&#xff0c;例如开发环境&#xff0c;测试环境、生产环境等。而不同环境的构建过程很可能是不同的&#xff0c;例如数据源配置、插件、以及依赖的版本等。每次将项目部署到不同的环境时&#xff0c;都需要修改相应的配置&#xff0c;这样…

day07_数组初识

数组的概述 数组就是用于存储数据的长度固定的容器&#xff0c;保证多个数据的数据类型要一致。 数组适合做一批同种类型数据的存储 数组中的元素可以是基本数据类型&#xff0c;也可以是引用数据类型。当元素是引用数据类型是&#xff0c;我们称为对象数组。 容器&#xff…

从0开始学C语言的个人心得笔记(10w字)

大学的计算机相关专业第一门教学的计算机语言就是c语言&#xff0c;很多大学生面对从未接触过的计算机语言&#xff0c;可能会觉得很难以上门&#xff0c;从而放弃学习c语言。这篇博客写的主要是个人学习C语言时候的知识总结点&#xff0c;不能保证全部是正确的&#xff0c;如有…

Kafka灵魂28问

第 1 题 Kafka 数据可靠性如何保证&#xff1f; 对于 kafka 来说&#xff0c;以下几个方面来保障消息分发的可靠性&#xff1a; 消息发送的可靠性保障(producer) 消息消费的可靠性保障(consumer) Kafka 集群的可靠性保障&#xff08;Broker&#xff09; 生产者 目前生产者…