如何在MySQL表中为10万行数据插入1-24循环序列值?
解决MySQL表中10万行插入1-24循环数字的问题
嘿,这个需求其实用MySQL的内置函数就能轻松搞定,不用写复杂的脚本,我分两种常见场景给你方案:
场景1:给现有表新增列并填充循环数字
假设你的表名叫your_table,已经有10万行数据,现在要新增一列(比如叫cycle_num)来存储1-24循环的数字。
方案A:MySQL 8.0+(支持窗口函数)
窗口函数ROW_NUMBER()可以快速给每行生成序号,再结合MOD()函数实现循环:
-- 先新增列 ALTER TABLE your_table ADD COLUMN cycle_num INT; -- 用窗口函数计算循环值并更新 UPDATE your_table t JOIN ( SELECT id, -- 这里用你的表的主键/唯一标识列,确保行顺序稳定 MOD(ROW_NUMBER() OVER (ORDER BY id) - 1, 24) + 1 AS cycle_num FROM your_table ) AS row_nums ON t.id = row_nums.id SET t.cycle_num = row_nums.cycle_num;
原理:
ROW_NUMBER() OVER (ORDER BY id)给每行按id排序生成1、2、3...的序号- 序号减1后对24取模,这样第24行的结果是23,加1后得到24;第25行序号减1是24,模24得0,加1回到1,完美实现循环。
方案B:MySQL 5.x(不支持窗口函数)
用用户变量来生成行号,同样结合MOD()函数:
-- 先新增列 ALTER TABLE your_table ADD COLUMN cycle_num INT; -- 初始化用户变量 SET @row_counter = 0; -- 更新数据 UPDATE your_table SET cycle_num = MOD((@row_counter := @row_counter + 1) - 1, 24) + 1 ORDER BY id; -- 这里的排序依据要和你期望的循环顺序一致
场景2:插入10万行数据时直接生成循环数字
如果是要插入新的10万行,同时附带1-24循环的数字,可以用递归CTE(MySQL 8.0+):
WITH RECURSIVE row_generator AS ( SELECT 1 AS row_id, 1 AS cycle_num UNION ALL SELECT row_id + 1, MOD(row_id, 24) + 1 -- 等价于 MOD(row_id - 1, 24) + 1,效果一致 FROM row_generator WHERE row_id < 100000 ) INSERT INTO your_table (cycle_num, [其他列名]) -- 替换成你的实际列名 SELECT cycle_num, [其他列的值] -- 比如如果其他列是固定值,就写固定值,或者按需生成 FROM row_generator;
注意事项
- 排序依据:不管是更新还是插入,
ORDER BY的列要确保是你需要的顺序,不然循环的起始位置可能不符合预期 - 性能:10万行数据的更新/插入在MySQL中属于常规操作,只要硬件正常,不会有太大问题;如果担心锁表,可以考虑分批操作(比如每次更新1万行)
内容的提问来源于stack exchange,提问作者VinoPravin
相关产品推荐
相关产品推荐

