首页 > 数据库 >mysql中游标的运用

mysql中游标的运用

时间:2022-12-05 16:37:18浏览次数:59  
标签:cur declare -- 游标 testrangeid versionid 标的 mysql 中游

【背景】     最近项目中应对实际情况的需求,又修改了主业务,导致表结构设计不合理,之后又修改了表结构,但是表结构修改之后历史数据需要升级,来适应新的表结构的一系列增删改查。
    我们的数据库是mysql。
    形象一点来说就是当前有三张表A、B、C其中A和B是一对多关系,B和C是一对多关系,现在需要将B中A表的主键存到C中;常规思路就是将B中查询出来然后通过一个update语句来更新C表就可以了,但是B表中有2000多条数据,难道要执行2000多次?显然是不现实的;最终找到写一个存储过程然后通过循环来更新C表,然而存储过程中的写法用的就是游标的形式。
    如下图:
mysql中游标的运用_游标 【简介】

    游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。

    游标充当指针的作用。

    尽管游标能遍历结果中的所有行,但他一次只指向一行。

    游标的作用就是用于对查询数据库所返回的记录进行遍历,以便进行相应的操作。
【用法】     一、声明一个游标: declare 游标名称 CURSOR for table;(这里的table可以是你查询出来的任意集合)
    二、打开定义的游标:open 游标名称;
    三、获得下一行数据:FETCH  游标名称 into testrangeid,versionid;
    四、需要执行的语句(增删改查):这里视具体情况而定
    五、释放游标:CLOSE 游标名称;
  注:mysql存储过程每一句后面必须用;结尾,使用的临时字段需要在定义游标之前进行声明。
【实例】     下面为基于背景中的需求做的一个例子:
-
BEGIN

--定义变量
declare testrangeid BIGINT;
declare versionid BIGINT; 
declare done int;
--创建游标,并存储数据
declare cur_test CURSOR for 
   select id as testrangeid,version_id as versionid from tp_testrange;
--游标中的内容执行完后将done设置为1
 DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1; 
--打开游标
open cur_test;
--执行循环
  posLoop:LOOP
--判断是否结束循环
		IF done=1 THEN  
      LEAVE posLoop;
    END IF; 
--取游标中的值
    FETCH  cur_test into testrangeid,versionid;
--执行更新操作
    update tp_data_execute set version_id=versionid where testrange_id = testrangeid;
  END LOOP posLoop;
--释放游标
CLOSE cur_test;

END
-

    执行后如下图所示:
mysql中游标的运用_表结构_02 【扩展】     针对于背景中的需求其实还可以这样做,如下图所示,通过级联将所有的字段查询出来->全选复制->将内容粘贴到excel中->清除C表->将excel中多余的列去掉,并将内容在C表结果中粘贴,保存(此法有很多局限,只提供思考角度,不建议此场景中使用)
mysql中游标的运用_存储_03 【总结】     遇到问题,寻找更加合适的方式方法来解决,并将涉及到的内容搞明白,能够做到举一反三的效果,这样在路上才会擦出理想的光芒。

标签:cur,declare,--,游标,testrangeid,versionid,标的,mysql,中游
From: https://blog.51cto.com/u_14471711/5913024

相关文章

  • docker 安装mysql8
    1.环境准备1.centos7  2.安装包下载1.百度网盘下载链接:https://pan.baidu.com/s/1AfRUkiXD9Oee1hA5az9SXg提取码:gs7b 2.版本说明此安装包为dockermysql8......
  • MySQL
    一、ACID1.1原子性(Atomicity)原子性是指一个事务是一个不可分割的工作单位,其中的操作要么都做,要么都不做,如果事务中一个sql语句执行失败,则已执行的语句也必须回滚,数......
  • mysql的varchar最大能存储多少个字符?
    mysql中varchar能够存储可变长度的字符串。过去我做的诸多业务中,一般存储短字符串的需求,都会使用varchar类型,并且定义长度为255,也就是varchar(255)。不过为了探究varchar......
  • mysql8 添加用户,赋予表操作权限
    1.mysql8修改了安全规则,不能像mysql5.7一次性创建用户并授权,需要分批创建1.创建用户createuser'username'@'host'identifiedby'password'创建用户说明:1.use......
  • CodeSmith部署安装以及编写MySQL模板的时候无法获取description
    最近需要使用VS2015开发新项目,由于考虑到后期的扩展性,打算使用EF的codefirst模式来编写,但是前期又设计好了数据库结构,不想大动干戈的去重新写代码,网上搜索了说用“EntityF......
  • MySQL字符串转换数字
    mysql将字符串转为数字的方法:1、利用“+”运算符,语法“'字符串'+0”;SELECTJSON_EXTRACT(charge_sts,'$.waiter')k1,JSON_EXTRACT(charge_sts,'$.waiter')+0k2,'01......
  • MySQL锁,锁的到底是什么?
    MySQL锁,锁的到底是什么? MySQL锁系列文章已经鸽了挺久了,最近赶紧挤了挤时间,和大家聊一聊MySQL的锁。只要学计算机,「锁」永远是一个绕不过的话题。MySQL锁也是一样。......
  • xp下安装ror+mysql最新心得
    话说不少前辈也说了,ROR最好在LINUX上跑,这个道理是知道的,但对于不用ROR开发的偶,单单扫下盲的话,就打算用WINDOW上算了,不过还是感受到在XP上装ROR......
  • MySQL命令
    1连接mysql命令:mysql-uroot-p2查看存储引擎:showengines;3显示database:showdatabases;4连接database:usedb01;5显示表信息:showcreatetablepayment;6直......
  • MySQL优化详解
    1.MySQL简介MySQL是一个关系型数据库管理系统,由瑞典MySQLAB公司开发,目前属于Oracle公司。Mysql是开源的,可以定制的,采用了GPL协议,你可以修改源码来开发自己的Mysql系......