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倒序,最新的数据排在前面。spa

若是建档日期有年月日 时分秒,而且不能修改建档日期,那么能够去最大的档案ID就是最新的,能够直接写update脚原本处理,注意须要执行屡次,以下:code

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;