【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、使用游标,因为要累加所以使用循环语句REPEATFETCH blog_cursor INTO current_views;SET sum_views = sum_views + current_views;SET blog_count = blog_count + 1;UNTIL sum_views >=  numEND 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
BEGININSERT 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 THENSIGNAL 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操作的触发器
如果父表数据修改引发了子表的数据变化,在这种情况下并不会激发触发器

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

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

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

相关文章

计算机毕业设计java 基于Android的拼图游戏app

当今社会,随着电子信息技术的发展,电子游戏也成为人们日常生活的一部分。这种娱乐方式结合了日新月异的技术,在游戏软件中结合了多种复杂技术。拼图游戏流行在各种电子产品上,从计算机,掌上游戏机到如今的手机&#xf…

Vue中的键盘事件

目 录 1. 概述 2. JavaScript 键盘事件 2.1 键盘事件类型 2.1.1 keydown 事件2.1.2 keypress 事件2.1.3 keyup 事件2.1.4 input 事件 2.2 键盘事件的响应顺序 3. Vue 键盘事件监听与处理 3.1 获取按键的 键码(keyCode)3.2 监听按键事件 4. Vue 按键…

【C++】继承总结

一、前言 我们众所周知的C三大特性分别为:封装、继承、多态。 封装就是将接口实现统一化,隐藏那些不同的地方,在上层函数调用体现的方式一样,如各种容器的迭代器iterator,尽管底层实现的方式不同,但是在使用…

2024免费Mac电脑用户的系统清理和优化软件CleanMyMac

作为产品营销专家,对于各类产品的特性与优势有着深入的了解。CleanMyMac是一款针对Mac电脑用户的系统清理和优化软件,旨在帮助用户轻松管理、优化和保护Mac电脑。以下是关于CleanMyMac的详细介绍: CleanMyMac X2024全新版下载如下: https://…

ctfshow web入门 文件包含 web151--web161

web151 打算用bp改文件形式(可能没操作好)我重新试了一下抓不到 文件上传不成功 改网页前端 鼠标右键&#xff08;检查&#xff09;&#xff0c;把png改为php访问&#xff0c;执行命令 我上传的马是<?php eval($_POST[a]);?> 查看 web152 上传马 把Content-Type改为…

相机标定——四个坐标系介绍

世界坐标系(Xw,Yw,Zw) 世界坐标系是一个用于描述和定位三维空间中物体位置的坐标系&#xff0c;通常反映真实世界下物体的位置和方向。它是一个惯性坐标系&#xff0c;被用作整个场景或系统的参考框架。在很多情况下&#xff0c;世界坐标系被认为是固定不变的&#xff0c;即它…

【THM】Protocols and Servers 2(协议和服务器 2

介绍 协议和服务器房间涵盖了许多协议: 远程登录HTTP协议文件传输协议邮件传输协议POP3IMAP实现这些协议的服务器会受到不同类型的攻击。仅举几例,请考虑: 嗅探攻击(网络数据包捕获)中间人 ( MITM ) 攻击密码攻击(身份验证攻击)漏洞从安全的角度来看,我们始终需要思考…

第四百四十四回

文章目录 1. 问题描述2. 优化方法2.1 缩小范围2.2 替代方法 3. 示例代码4. 内容总结 我们在上一章回中介绍了"如何获取AppBar的高度"相关的内容&#xff0c;本章回中将介绍关于MediaQuery的优化.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 问题描述 我们在…

【Java程序员面试专栏 综合面试指南】5年资深程序员面试指南

基础知识对于5年内工作经验的同学考察相对比较多。包括编程语言、计算机网络、操作系统、设计模式、分布式知识、MySQL、Redis这种。其中随着年限的增长,基础知识考察的会越来越少,例如操作系统基本上只在学生阶段考察,计算机网络对于5年经验来说也考察的相对较少。5年以上对…

基于opencv的猫脸识别模型

opencv介绍 OpenCV的全称是Open Source Computer Vision Library&#xff0c;是一个跨平台的计算机视觉库。OpenCV是由英特尔公司发起并参与开发&#xff0c;以BSD许可证授权发行&#xff0c;可以在商业和研究领域中免费使用。OpenCV可用于开发实时的图像处理、计算机视觉以及…

ChatGPT基础(一) GPT的前世今生

文章目录 GPT模型简史GPT系列模型ChatGPT的应用 最近ChatGPT3.5可以免注册使用了&#xff0c;出来刨一波坟 说一说ChatGPT的来源和应用。 GPT模型简史 Generative pre-trained transformers(GPT)生成式预训练转换模型是大语言模型的一种(Large Language Model–>LLM)。它是…

海外网红营销的UGC策略:激发用户创意,提升品牌知名度

在当今数字时代&#xff0c;品牌营销已经从传统的广告宣传转变为了与用户互动和参与密切相关的形式。UGC作为一种强大的营销策略&#xff0c;正在成为品牌提升知名度和美誉度的关键手段之一。尤其是通过海外网红的传播&#xff0c;UGC的影响力更是得到了进一步放大。本文Nox聚星…

基于Springboot4S店车辆管理系统

采用技术 基于Springboot4S店车辆管理系统的设计与实现~ 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBootMyBatis 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 页面展示效果 管理员功能 首页 销售员管理 维修员管理 客户管理 供应…

RabbitMQ的交换机与队列

一、流程 首先先介绍一个简单的一个消息推送到接收的流程&#xff0c;提供一个简单的图 黄色的圈圈就是我们的消息推送服务&#xff0c;将消息推送到 中间方框里面也就是 rabbitMq的服务器&#xff0c;然后经过服务器里面的交换机、队列等各种关系&#xff08;后面会详细讲&am…

基于springboot+vue实现的酒店客房管理系统

作者主页&#xff1a;Java码库 主营内容&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取源码 技术选型 【后端】&#xff1a;Java 【框架】&#xff1a;spring…

【大数据】安装hive-3.1.2

1、上传HIVE包到/opt/software目录并解压到/opt/modules/ tar -zxvf apache-hive-3.1.2-bin.tar.gz -C /opt/modules/ 2、修改路径 mv /opt/modules/apache-hive-3.1.2-bin/ /opt/modules/hive 3、将hIVE下的bin目录加入到/etc/profile中 export HIVE_HOME/opt/module…

iOS 17.5系统或可识别并禁用未知跟踪器,苹果Find My技术应用越来越合理

苹果公司去年与谷歌合作&#xff0c;宣布将制定新的行业标准来解决人们日益关注的跟踪器隐私问题。苹果计划在即将发布的 iOS 17.5 系统中加入这项提升用户隐私保护的新功能。 科技网站 9to5Mac 在苹果发布的 iOS 17.5 开发者测试版内部代码中发现了这项反跟踪功能的蛛丝马迹…

性能分析-docker知识

docker的相关概念 docker是一个做系统虚拟化的软件&#xff0c;跟vmware类似&#xff0c;虚拟出来的也是操作系统。我们现在在企业中&#xff0c; 使用docker虚拟出来的系统&#xff0c;大多都是linux系统。 docker镜像image&#xff1a;就是虚拟一个docker容器需要的操作系统…

微信小程序实现滚动标签

使用scroll-view标签可实现组件滚动标签 1、list中 list.wxml代码如下: <!--pages/list/list.wxml--> <navigation-bartitle"小程序" back"{{false}}"color"black" background"#FFF"></navigation-bar><scroll-…

蓝桥杯嵌入式备考笔记

这里写目录标题 keil配置LED-KEY-LCDledkeyLCD最多21位 RTCPWM捕获占空比ADCI2C按键长按uartPWMDAC双击高亮EEp初始化LED闪烁时间倒计时 keil配置 LED-KEY-LCD 留下这几个 按键 创建俩个文件写代码&#xff0c;记得把这两个文件加进工程 led uwTick 1ms执行一次 写错…