• 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; /*使用完毕后要删除垃圾*/

    完毕,收工!

  • 相关阅读:
    CentOS安装Docker
    Spring内异常 application exception overridden by commit exception
    SVN里恢复到某一天的版本操作
    BootStrap如何支持多模态框弹窗
    Finally使用时报"finally block does not complete normally"
    dom4j解析XML文件
    避免先查询再插入的解决方案
    List<T>转换Datable 数据
    DataTable转Json Json转DataTable
    sql 自动生成编号函数
  • 原文地址:https://www.cnblogs.com/wjx-blog/p/7719605.html
Copyright © 2020-2023  润新知