实现效果示例
执行SQL:(mysql 版本查看: select VERSION() :5.7.36-log)
实现效果:
这里最后一个id = 9 > 总条数 6,所以没有更新到,直接手动补下就行
SELECT * FROM `my_test`
SELECT COUNT(*) FROM my_test;
-- 需求:外部系统需要获取10w客户初始数据,通过更新时间来获取
-- 先确定,有没有其他地方拉去客户数据,使用到update_time,如果没有,执行下面步骤:
-- 1.先补全客户头表的所有更新时间:每条1000条设置为一天,从2017-01-01开始,相当于每天更新1000个客户信息
-- 2.更新完之后,检查是否有更新时间为null的,可能存在id号>总条目数的,存在的,直接设置为新的一天就好
-- 3.外部系统从2017-01-01- 开始每天一调
DELIMITER //
CREATE PROCEDURE batch_update_my_test()
BEGIN
DECLARE batch_size INT DEFAULT 2;
DECLARE start_date VARCHAR(255) DEFAULT '2017-01-01';
DECLARE cur_date VARCHAR(255) DEFAULT start_date;
DECLARE total_rows INT;
DECLARE current_row INT DEFAULT 0;
DECLARE num_batches INT;
-- 获取总行数 5
SELECT COUNT(*) INTO total_rows FROM my_test;
-- 计算批处理数量 3
SET num_batches = CEIL(total_rows / batch_size);
-- 当当前行号<总条目数时 0 < 5
WHILE current_row < total_rows DO
-- 2
SET current_row = current_row + batch_size;
-- 更新当前批次的数据0<id<2
UPDATE my_test
SET update_time = cur_date
WHERE id > (current_row - batch_size) AND id <= current_row;
-- 设置下次更新日期
SET cur_date = DATE_ADD(cur_date, INTERVAL 1 DAY);
END WHILE;
END //
DELIMITER ;
-- 执行存储过程
CALL batch_update_my_test();
-- 查看所有存储过程
show PROCESSLIST
-- 杀死进程
kill [进程id]