zoukankan      html  css  js  c++  java
  • mysql批量更新数据,即:循环select记录然后更新某一字段

    事情的原委:

      今天遇到一个问题:一个数据表case_folder_info想要实现自定义排序功能,就在表里新加了一个字段SORT_NUMBER,由于表里存在已有数据,所以这个SORT_NUMBER字段都为空,但要想实现上移、下移、置顶等功能的话,需要里面有默认数据,所以我想给这个字段里默认有一些排序的值。

    思考解决办法:

      1、用c#写个小程序,然后取出来所有数据,UPDATE一遍,这个还得新建项目,添加数据库连接字符串,添加数据库类库引用,太麻烦。

      2、用数据库自带的命令行方式实现。

      最终经过我头脑的一番小斗争,虽然sql不太熟但还是决定尝试一下吧。

    sql实现的思路:

      由于命令行中无法直接使用declare这样使用变量,所以干脆用非常规的方式来解决吧,先建一个临时的存储过程,在存储过程中实现我要想的循环赋值,然后使用完后再删除这个存储过程就可以了。

    具体的sql语句:

    /*判断是否存在,如果存在就删除*/
    drop procedure if exists tempProcedure_Test;/*取一个系统中绝对不会用到的存储过程名称*/
    /*创建临时存储过程*/
    create procedure tempProcedure_Test()
    BEGIN
    declare isDone int default 0; /*判断是否还有记录*/
    declare intNumber int default 1;/*用于自增的变量*/
    declare tempId char(36); /*每条记录循环时的临时ID*/

    declare folderIds cursor for select A.ID from case_folder_info as A;/*取出来所有需要循环的数据*/
    declare continue handler for not FOUND set isDone = 1;/*如果不存在就设置为1,即为true*/
    open folderIds; /*OPEN*/

    REPEAT /*开始循环数据*/
    fetch folderIds into tempId;
    if not isDone THEN
    update case_folder_info set SORT_NUMBER=intNumber where id=tempId;
    set intNumber=intNumber+1;
    end if;
    until isDone end repeat;
    close folderIds; /*CLOSE,对应上面的open folderIds;*/
    END;
    call tempProcedure_Test();/*调用下这个临时的存储过程*/
    drop procedure tempProcedure_Test; /*使用完毕后要删除垃圾*/

    完毕,收工!

  • 相关阅读:
    记一次centos7.2下用crontab执行定时任务的过程(初级)
    海外手机号码正则匹配
    装了wamp之后,80端口被占用解决办法
    newtonsoft动态修改JObject
    .net正则提取手机号码,并替换带有手机号码的a标签
    .vs目录有什么用?
    centos7安装nginx-1.13.6 新手入门,图文解析
    centos7安装kafka_2.11-1.0.0 新手入门
    centos7安装apache 新手入门 图文教程
    面向对象——案例练习(4)判断点是否在圆的内部
  • 原文地址:https://www.cnblogs.com/wjx-blog/p/7719605.html
Copyright © 2011-2022 走看看