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

    -- 处理IEMI重复的历史数据,建档日期(只有年月日)倒序,档案ID倒序,根据IMEI查档案,查询的结果,相同IMEI下的第一条记录的IEMI不处理,其他的记录的imei 改为空。

    -- USE `testdb`;选择对应的数据库名称
    
    -- 创建存储过程proc_UpdateIMEIUser
    
    /*判断是否存在,如果存在就删除*/
    DROP PROCEDURE IF EXISTS `proc_UpdateIMEIUser`;
    
    DELIMITER $$
    
    CREATE DEFINER=`root`@`%` PROCEDURE `proc_UpdateIMEIUser`(IN valIMEI VARCHAR(100))
    BEGIN
    DECLARE temNumber INT DEFAULT 0;
    DECLARE TempUserID INT; /*每条记录循环时的临时ID*/
    DECLARE isDone INT DEFAULT 0; /*判断是否还有记录*/
    DECLARE UpdateIMEICursor CURSOR FOR SELECT UserID FROM `sysUser` WHERE IMEI =valIMEI ORDER BY CreateDate DESC,UserID DESC;/*游标处理*/
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET isDone = 1;/*如果不存在就设置为1,即为true*/
    OPEN UpdateIMEICursor; /*OPEN*/
    REPEAT /*开始循环数据*/
    FETCH UpdateIMEICursor INTO TempUserID;
    IF NOT isDone THEN
    IF temNumber > 0 THEN
    UPDATE sysUser SET IMEI='' WHERE UserID=TempUserID;
    END IF;
    SET temNumber=temNumber+1; 
    END IF;
    UNTIL isDone END REPEAT;
    CLOSE UpdateIMEICursor;/*CLOSE,对应上面的open IMEICursor;*/
    END $$
    DELIMITER ;
    
    -- 创建存储过程 proc_IMEIUser
    
    /*判断是否存在,如果存在就删除*/
    DROP PROCEDURE IF EXISTS `proc_IMEIUser`;
    
    DELIMITER $$
    
    CREATE DEFINER=`root`@`%` PROCEDURE `proc_IMEIUser`()
    BEGIN
    DECLARE valIMEI VARCHAR(100); /*每条记录循环时的临时IMEI*/
    DECLARE isDone INT DEFAULT 0; /*判断是否还有记录*/
    DECLARE IMEICursor CURSOR FOR SELECT IMEI FROM `sysUser` WHERE IsDel = 0 AND IMEI <>'' AND IMEI IS NOT NULL GROUP BY IMEI HAVING COUNT(*) > 1;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET isDone = 1;/*如果不存在就设置为1,即为true*/
    OPEN IMEICursor; /*OPEN*/
    REPEAT /*开始循环数据*/
    FETCH IMEICursor INTO valIMEI;
    IF NOT isDone THEN
    CALL proc_UpdateIMEIUser(valIMEI);
    END IF;
    UNTIL isDone END REPEAT;
    CLOSE IMEICursor;/*CLOSE,对应上面的open IMEICursor;*/
    END $$
    DELIMITER ;
    
    -- 执行存储过程处理IMEI的重复数据
    CALL proc_IMEIUser();
    
    /*使用完毕后要删除存储过程*/
    DROP PROCEDURE proc_UpdateIMEIUser;
    DROP PROCEDURE proc_IMEIUser; 

    注意:建档日期只有年月日, 而且有修改的入口,所以才先将建档日期倒序,档案ID倒序,最新的数据排在前面。

    如果建档日期有年月日 时分秒,并且不能修改建档日期,那么可以去最大的档案ID就是最新的,可以直接写update脚本来处理,注意需要执行多次,如下:

    UPDATE `sysUser` a,(SELECT MIN(UserID) AS UserID FROM `sysUser` WHERE IsDel = 0 
    AND IMEI IS NOT NULL AND IMEI <>''
    GROUP BY IMEI
    HAVING COUNT(*) > 1) b 
    SET a.IMEI =''
    WHERE a.IsDel = 0 AND a.`UserID` = b.UserID; 
  • 相关阅读:
    Python第二弹--------类和对象
    Python第一弹--------初步了解Python
    Java标记接口
    CentOS7下的YUM源服务器搭建详解,过程写的很详细(转)
    CentOS7.0安装Nginx 1.10.0
    QT中C++与Html端通信例子
    QT基础:QMainWindow学习小结
    QT基础:QT 定时器学习
    QT3D场景快速绘制入门学习
    QT编译错误:cannot find file: *.pro
  • 原文地址:https://www.cnblogs.com/allenhua/p/10795714.html
Copyright © 2011-2022 走看看