Mysql 循环更新
使用 存储过程+游标 循环更新大量数据
DROP PROCEDURE IF EXISTS temp_data;/*存在即删除*/DELIMITER // /*有些数据库默认分号为执行语句结束符号,这里改下结束符号*//*创建临时存储过程*/
CREATE PROCEDURE temp_data()
BEGIN
DECLARE is_done INT DEFAULT 0;/*判断循环结束标识*/
DECLARE tempId CHAR(36);/*每条记录循环时的临时ID*//*定义游标*/
DECLARE namesIds CURSOR FOR SELECT id FROM names where status = 1;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET is_done = 1;/*上面数据消耗完设置循环结束标志为1 ,即为true*/
OPEN namesIds; /*打开游标*/REPEAT /*开始循环数据*/
FETCH namesIds INTO tempId;
IF NOT is_done THEN
UPDATE record SET nums = (SELECT COUNT(1) FROM history WHERE names_id = tempId)
WHERE
names_id = tempId; /*更新语句*/
END IF;
UNTIL is_done END REPEAT;
CLOSE namesIds; /*CLOSE,释放资源*/
END //DELIMITER ; /*当创建完一个存储过程之后再将分隔符替换为分号,为了不影响其他的操作*/
CALL temp_data(); /*调用存储过程*/
DROP PROCEDURE temp_data; /*调用完删掉*/
Mysql 循环更新
使用 存储过程+游标 循环更新大量数据
DROP PROCEDURE IF EXISTS temp_data;/*存在即删除*/DELIMITER // /*有些数据库默认分号为执行语句结束符号,这里改下结束符号*//*创建临时存储过程*/
CREATE PROCEDURE temp_data()
BEGIN
DECLARE is_done INT DEFAULT 0;/*判断循环结束标识*/
DECLARE tempId CHAR(36);/*每条记录循环时的临时ID*//*定义游标*/
DECLARE namesIds CURSOR FOR SELECT id FROM names where status = 1;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET is_done = 1;/*上面数据消耗完设置循环结束标志为1 ,即为true*/
OPEN namesIds; /*打开游标*/REPEAT /*开始循环数据*/
FETCH namesIds INTO tempId;
IF NOT is_done THEN
UPDATE record SET nums = (SELECT COUNT(1) FROM history WHERE names_id = tempId)
WHERE
names_id = tempId; /*更新语句*/
END IF;
UNTIL is_done END REPEAT;
CLOSE namesIds; /*CLOSE,释放资源*/
END //DELIMITER ; /*当创建完一个存储过程之后再将分隔符替换为分号,为了不影响其他的操作*/
CALL temp_data(); /*调用存储过程*/
DROP PROCEDURE temp_data; /*调用完删掉*/