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; 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM