【mysql】实现设置表中所有数据的update_time,要求每1000条设置在一天

实现效果示例

在这里插入图片描述

执行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]
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宋大米Pro

感谢小主大赏,留言可进互助群~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值