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

博客展示了MySQL版本查看的SQL语句,即select VERSION(),当前版本为5.7.36 - log。还给出实现效果示例,提到当最后一个id大于总条数时未更新到数据,可手动补充。

实现效果示例

在这里插入图片描述

执行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]
MySQL 中,查询 `machine_file` 中 `update_time` 字段早于 30 天前的数据,可以通过 `NOW()` 函数结合时间间隔函数 `INTERVAL` 来实现时间件筛选。具体 SQL 语句如下: ```sql SELECT * FROM machine_file WHERE update_time < NOW() - INTERVAL 30 DAY; ``` 该语句的含义是筛选出 `update_time` 小于当前时间减去 30 天的所有记录。`NOW()` 函数用于获取当前的时间戳,而 `INTERVAL 30 DAY` 时间间隔为 30 天[^4]。 如果需要更精确地控制日期格式或处理特定时区,也可以使用 `CURDATE()` 或 `DATE_SUB()` 函数进行替代: ```sql SELECT * FROM machine_file WHERE update_time < DATE_SUB(CURDATE(), INTERVAL 30 DAY); ``` 此语句与前一个语句功能相同,但使用了 `CURDATE()` 获取当前日期,并通过 `DATE_SUB()` 函数减去 30 天来构造筛选件[^2]。 --- ### 时间字段类型与性能注意事项 在实际使用中,若 `update_time` 字段的类型为 `DATE` 或 `DATETIME`,上述查询均可正常执行。若字段类型为 `TIMESTAMP`,则需注意其取值范围限制。在 32 位系统中,`TIMESTAMP` 的最大支持年份为 2038 年,而在 64 位系统中则可支持至 2106 年。对于 `DATE` 和 `DATETIME` 类型,则没有此类限制,均能支持到 9999-12-31 的日期范围[^2]。 --- ### 示例:结合索引优化查询性能 为了提升查询性能,特别是在数据量较大的情况下,建议对 `update_time` 字段建立索引: ```sql CREATE INDEX idx_update_time ON machine_file(update_time); ``` 建立索引后,查询引擎可以更高效地定位符合件的数据,显著减少全扫描带来的性能开销[^4]。 --- ### 相关问题 1. 如何在 MySQL 中查询某个时间字段为特定日期的数据? 2. MySQL 中不同时间类型(DATE、DATETIMETIMESTAMP)的区别是什么? 3. 如何优化 MySQL时间字段的查询性能? 4. MySQL 中的 NOW() 和 CURDATE() 函数有什么区别? 5. 在 MySQL 中如何删除 30 天之前的数据
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

码元宋大米

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

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

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

打赏作者

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

抵扣说明:

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

余额充值