需求:
有时我们会想将数据库表中的某个字段更新为等差数列,N条数据为一组。
比如数据库中存储着许多轮询任务,其中有一列是轮询周期,为了避免同一时间大批量轮询任务同时执行,我们要将这些任务10个为一组,每组周期差值为质数
。这里我们规定最小轮询周期为300秒,差值为7,我们可以直接用SQL来更新:
UPDATE (
SELECT
PT.*,
300 + FLOOR((ROW_NUMBER() OVER (ORDER BY ID) - 1) / 10) * 7 AS NEW_FREQUENCY
FROM POLLING_TASK PT
) PT
SET PT.FREQUENCY = PT.NEW_FREQUENCY;
解释:
ROW_NUMBER() OVER (ORDER BY ID)
按照ID
排序后生成行号(可以写成其他列名)
FLOOR
向下取整
通过这两个函数计算得到每10条数据为一组的编号,乘以7,再加上初始值300,就可以得到我们想要的轮询周期,并通过SELECT合并到要更新的表中作为新的一列,之后通过UPDATE将这一列赋值到想要更新的字段中