【MySQL】游标和触发器

一、游标

1.1 什么是游标

1、使用背景
在我们使用update或者delete操作数据时,一般都会根据条件语句查询出很多条记录组成的数据集,然后一次性批量操作

假设我们想要对这个结果集中的数据 一行一行的进行操作,比如某个条件满足后,就不继续往下操作了,这个时候就要用到游标了

游标可以在存储过程和函数中使用

2、使用步骤

  • 声明游标(位置放在变量声明语句的后面,因为变量声明必须紧跟begin)
    MySQL、DB2、SQL server和Maria DB中的声明语法为
    DECLARE cursor_name CURSOR FOR 查询语句;
    Oracle、Postgresql中的声明语法为
    DECLARE cursor_name CURSOR IS 查询语句;
  • 打开游标
    OPEN cursor_name;
  • 使用游标:从游标中获取数据(注意:var_name必须在声明游标之前就定义好)
    FETCH cursor_name INTO var_name,var_name2...;
    这句话的作用是使用cursor_name来读取当前行,并将数据保存到变量var_name中,游标指针指向下一行,如果读取的数据行有多个字段,那就在INTO关键字后赋值给多个变量
  • 关闭游标
    CLOSE cursor_name;

3、使用案例
新建一个博客表t_blog_view,设定一个值num
看看最少需要累加多少篇博客的浏览量才能达到这个值(根据浏览量做一个降序排列)

CREATE TABLE `t_blog_view`  (
  `blog_name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '博客名称',
  `blog_author` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '博客作者',
  `blog_views` int(20) NOT NULL COMMENT '博客浏览量'
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;


INSERT INTO `t_blog_view` VALUES ( 'Mybatis系列', 'Decade0712', 2000);
INSERT INTO `t_blog_view` VALUES ( 'Spring系列', 'Decade0712', 4000);
INSERT INTO `t_blog_view` VALUES ( '设计模式系列', 'Decade0712', 6000);
INSERT INTO `t_blog_view` VALUES ( 'JVM系列', '十年', 8000);
INSERT INTO `t_blog_view` VALUES ( 'MySQL基础', 'Decade0712', 4000);
INSERT INTO `t_blog_view` VALUES ( 'Java8新特性', '十年', 5500);

我们定义一个存储过程进行测试

DELIMITER //

CREATE PROCEDURE test_cursor(IN num DOUBLE,OUT res_count INT)
BEGIN
	# 声明局部变量
	DECLARE sum_views DOUBLE DEFAULT 0.0; # 记录累加浏览量
	DECLARE current_views DOUBLE;  # 记录当前博客浏览量
	DECLARE blog_count INT DEFAULT 0; # 记录累加博客数
	
	# 1、声明游标
	DECLARE blog_cursor CURSOR FOR SELECT blog_views from t_blog_view ORDER BY blog_views DESC;
	
	# 2、打开游标
	OPEN blog_cursor;
	
	# 3、使用游标,因为要累加所以使用循环语句
	REPEAT
		FETCH blog_cursor INTO current_views;
		
		SET sum_views = sum_views + current_views;
		SET blog_count = blog_count + 1;
		UNTIL sum_views >=  num
	END REPEAT;
	
	# 把累加的博客数赋值给输出变量
	SET res_count = blog_count;

	# 4、关闭游标
	CLOSE blog_cursor;
END //

DELIMITER ;

# 进行调用
CALL test_cursor(10086,@res_count);
SELECT  @res_count;

# 删除存储过程
DROP PROCEDURE test_cursor;

结果如下
在这里插入图片描述
4、优缺点

  • 优点:使用游标,能够逐条读取结果集中的数据
  • 缺点:使用游标,会对数据进行加锁,在业务并发量大时,会影响业务的效率,并且会消耗系统内存资源

二、触发器

1、使用场景
假设我们现在有2张表商品表和库存表,我们新引入一种商品时,除了要修改商品表的数据,还要修改库存表的数据

为了保证不遗漏任何一个动作,我们一般使用事务将其包裹起来,使这两个动作成为一个原子操作

或者使用触发器,让商品表数据插入的动作自动触发库存表数据插入的动作

2、概述
触发器是由事件来触发某个操作,包括INSERT、UPDATE、DELETE事件。事件就是指用户的动作或者触发某项行为。如果定义了触发程序,当数据库执行这些语句的时候就相当于事件发生了,就会自动激发触发器去执行相应的操作

3、触发器的创建

CREATE TRIGGER 触发器名
{BEFORE|AFTER} {INSERT|UPDATE|DELETE} ON 表名
FOR EACH ROW
触发器执行的语句块;
  • 表名:触发器监控的对象
  • BEFORE|AFTER:表示触发的时间,是在事件发生之前还是发生之后
  • INSERT|UPDATE|DELETE:表示触发的事件,是插入数据事件、更新数据事件还是删除数据事件
  • FOR EACH ROW:每操作一条表中的数据,就激发一次触发器
  • 触发器执行的语句块:可以是单条语句块,也可以是BEGIN...END包裹的复杂语句块

4、举例
我们新建2张表,test_triggle和test_triggle_log,每当我们要向test_triggle中插入数据时,先在test_triggle_log中记录日志

CREATE TABLE test_triggle(
id INT PRIMARY KEY AUTO_INCREMENT,
t_note VARCHAR(30)
);

CREATE TABLE test_triggle_log(
id INT PRIMARY KEY AUTO_INCREMENT,
t_log VARCHAR(30)
);

创建触发器

DELIMITER //
CREATE TRIGGER test_trigger_tir
BEFORE INSERT ON test_triggle
FOR EACH ROW
BEGIN
	INSERT INTO test_triggle_log(t_log)
	VALUES('before insert to...');
END //
DELIMITER ;

INSERT INTO test_triggle(t_note)
VALUES('test insert DEMO1...');

SELECT * FROM test_triggle;
SELECT * FROM test_triggle_log;

结果如下,test_triggle_log表中自动增加了一条记录
在这里插入图片描述
案例二:我们向表test_triggle中插入数据前,需要先对这条记录的id做一个判断,如果是双数,就报错,否则就正常插入

注意:我们使用NEW表示INSERT要插入的那条数据,要获取某个字段,使用NEW.column即可
使用OLD表示DELETE要删除的那条数据

DELIMITER //
CREATE TRIGGER test_trigger_tir_single_num
BEFORE INSERT ON test_triggle
FOR EACH ROW
BEGIN
	# 创建一个变量,将当前记录的id对2取余的结果赋值给它,以便于后续做单双数的判断
	DECLARE is_single INT;
	SELECT NEW.id % 2 INTO is_single;
	
	IF is_single = 0 THEN
		SIGNAL SQLSTATE 'HY000' SET MESSAGE_TEXT = 'id为双数无法插入';
	END IF;
END //
DELIMITER ;

# 测试
INSERT INTO test_triggle(id,t_note) VALUES(1,'test insert DEMO1...');
INSERT INTO test_triggle(id,t_note) VALUES(2,'test insert DEMO2...');

# 查看test_triggle表是否正常插入数据
SELECT * from test_triggle;

结果如下,id为双数时,无法插入数据
在这里插入图片描述
在这里插入图片描述

5、查看触发器

# 查看所有触发器的定义
SHOW TRIGGERS;

# 查看指定触发器的定义
SHOW CREATE TRIGGER 触发器名称;

# 从系统库information_schema中查看触发器的定义
SELECT * FROM information_schema.TRIGGERS;

6、删除触发器

DROP TRIGGER IF EXISTS 触发器名称;

7、触发器的优缺点

  • 优点:
    • 可以保证数据的完整性
    • 可以通过触发器帮助我们记录数据的操作日志
    • 可以在操作数据前,对数据的合法性做一个检验
  • 缺点:
    • 可读性差
    • 相关数据的变更,可能会导致触发器报错

8、注意点
如果在子表中定义了外键约束,且子表的中又定义了基于此表UPDATE或者DELETE操作的触发器
如果父表数据修改引发了子表的数据变化,在这种情况下并不会激发触发器

如有错误,欢迎指正!!!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

一开始我只是接单试试水而已,后来我居然财富自由了!

一开始我只是抱着试一试的心态,浅浅的尝试了一下网上接单,没办法,这风太大了!网上个个儿说的神乎其神的,尤其是动不动就几十W,没办法,我眼红啦!赚钱嘛,不丢人&#xff01…

设计模式总结-建造者模式

建造者模式 模式动机模式定义模式结构模式分析建造者模式实例与解析实例:KFC套餐 模式动机 无论是在现实世界中还是在软件系统中,都存在一些复杂的对象,它们拥有多个组成部分,如汽车,它包括车轮、方向盘、发送机等各种…

7-3 值班安排 (python实现) 【函数嵌入】【遍历已修改字典】【字典按值对键排序】

题目 医院有A、B、C、D、E、F、G 7位大夫,在一星期内(星期一至星期天)每人要轮流值班一天,如果已知: (1)A大夫比C大夫晚1天值班; (2)D大夫比E大夫晚1天值班&…

手机软件何时统一--桥接模式

1.1 凭什么你的游戏我不能玩 2007年苹果手机尚未出世,机操作系统多种多样(黑莓、塞班、Tizen等),互相封闭。而如今,存世的手机操作系统只剩下苹果OS和安卓,鸿蒙正在稳步进场。 1.2 紧耦合的程序演化 手机…

gma 教程:计算标准化降水指数(SPI)

安装 gma:pip install gma (依赖的 gdal 需自行安装) 本文基于:gma 2.0.8,Python 3.10 本文用到数据请从 gma 网站获取:https://gma.luosgeo.com/UserGuide/climet/Index/SPI.html 。 SPEI 函数简介 gma.c…

Spring 中类似 aBbb 单字母单词序列化与反序列问题

文章目录 前言代码准备问题排查lombok自定义生成 get、set 结合源码解析使用 lombok使用 lombok 自定义生成 user 对象 get、set 方法 如何解决使用注解 JsonProperty("aTest")自定义实现符合 Spring 规范的 get set 方法 个人简介 前言 最近在使用 spring boot mvc…

SpringBoot整合RabbitMQ------------->直连交换!!!

一、创建一个springboot项目 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency> 二、配置RabbitMQ连接 1、在application.properties或application.…

蓝桥杯 - 九宫幻方

解题思路&#xff1a; 枚举法 import java.util.Scanner;//枚举法&#xff0c;采用枚举的方式存储不同的九宫格排列 public class Main {// 定义九个不同的九宫格排列public static int[][] exp {{ 4, 9, 2, 3, 5, 7, 8, 1, 6 },{ 8, 3, 4, 1, 5, 9, 6, 7, 2 },{ 6, 1, 8, 7…

五分钟快速搭建五金行业小程序商城教程解析

作为五金行业的从业者&#xff0c;你可能想要拓展线上业务&#xff0c;提供更方便快捷的购物体验给顾客。而小程序商城成为了一种非常受欢迎的方式。但是&#xff0c;你可能觉得不懂代码无法实现这样的小程序商城。现在&#xff0c;我将通过以下步骤&#xff0c;教你如何在五分…

vitepress系列-02-设置自定义的首页

文章目录 设置自定义的首页进阶版设置首页 设置自定义的首页 初始首页效果&#xff1a; 设置成自己的首页&#xff0c;更改config.mts和 docs/index.md文件&#xff1a; 设置版权 export default defineConfig({lang: en-US,title: "东东爱编码的技术博客",descrip…

【Unity每日一记】鼠标相关API

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;uni…

[pyenv] 1. 安装与使用

在看了几个开源的python环境管理器的评论后, 我打算入手 pyenv, 该项目有以下几个优势: 该项目使用纯shell脚本语言实现, 天然亲和linux开发环境.通过设置的PATH环境变量和shims方法隔离的实现方案非常轻量化.子命令引入了compgen补全功能, 对命令输入操作友好.源码开源, 可扩展…

企业进货出货统计软件,简单、好用、高效!

企业进货出货统计是一件比较繁琐的事情&#xff0c;如果还是按照传统的方式&#xff0c;不仅效率低&#xff0c;还会出现漏单&#xff0c;错单的情况发生。如今大多数企业都选择使用进货出货统计软件&#xff0c;简单、好用、还高效&#xff0c;不仅能节省人力&#xff0c;成本…

iOS 应用内网络请求设置代理

主要通过URLSessionConfiguration 的connectionProxyDictionary 属性 为了方便其他同学使用&#xff0c;我们可以通过界面来进行设定&#xff08;是否开启代理、服务端、端口&#xff09;&#xff0c;从而达到类似系统上的设定 具体链接参考&#xff1a;为 iOS 网络请求设置代理…

算法整理:二分查找

二分查找&#xff1a;在有序集合搜索特定值的过程&#xff0c;每次比较之后将查找空间一分为二。 target:要查找的值 index:当前位置 left,right:维持查找空间的指标 mid:用来确定向左查还是向右查的索引 查找空间: [left,right] 二分查找维护left&#xff0c;right&#xff0c…

代码随想录Day27:回溯算法Part3

Leetcode 39. 组合总和 讲解前&#xff1a; 这道题其实在掌握了之前的组合问题之后再看并不是那么难&#xff0c;其关键就在于我们这道题中没有一个特定需要的组合大小&#xff0c;并且列表中的元素是可以重复使用的&#xff0c;那么比如说给的例子中的 输入: candidates [2…

探索基于WebRTC的有感录屏技术开发流程

title: 探索基于WebRTC的有感录屏技术开发流程 date: 2024/4/7 18:21:56 updated: 2024/4/7 18:21:56 tags: WebRTC录屏技术屏幕捕获有感录屏MediaStream实时传输音频录制 第一章&#xff1a;技术原理 WebRTC&#xff08;Web Real-Time Communication&#xff09;是一种开放源…

蓝桥杯真题代码记录(数位排序

目录 1. 题目&#xff1a;2. 我的代码&#xff1a;小结&#xff1a; 1. 题目&#xff1a; 小蓝对一个数的数位之和很感兴趣, 今天他要按照数位之和给数排序。当 两个数各个数位之和不同时, 将数位和较小的排在前面, 当数位之和相等时, 将数值小的排在前面。 例如, 2022 排在 40…

Redis分布式锁的实现核心思路

4.2 、Redis分布式锁的实现核心思路 实现分布式锁时需要实现的两个基本方法&#xff1a; 获取锁&#xff1a; 互斥&#xff1a;确保只能有一个线程获取锁非阻塞&#xff1a;尝试一次&#xff0c;成功返回true&#xff0c;失败返回false 释放锁&#xff1a; 手动释放超时释放&…

宏电“窨井卫士”家族成员大公开:城市地下生命线安全守卫者

窨井是城市建设中非常重要的基础设施 井内的水位、流量、水质情况 能直观反映城市排水管网的运行状态 秉承宏电智能感知技术的积累与沉淀 针对窨井水位、流量、水质监测领域 宏电“窨井卫士”家族产品各显神通 为窨井安全运行保驾护航 窨井水位监测卫士 H1600D智能水位监…