You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于现有行填充MySQL 8.x中的position(INT)列?

MySQL 8.x 按分组填充position列方案

环境:MySQL 8.x

现有表结构

idnameparent_fkposition (INT)
123abc1
124def1
125xyz2
126ghi1
127def2
128abc3

需求说明

  • 按parent_fk分组,为每组内的行填充position值,从0开始递增1
  • 同一parent_fk下的position值唯一
  • 排序规则无严格要求,只需按脚本执行时的行顺序分配即可

目标状态示例

idnameparent_fkposition
12345abc10
12346def11
12347xyz20
12348ghi12
12349def21
12350abc30

解决方案SQL

1. 新增position列(若尚未添加)

ALTER TABLE your_table_name 
ADD COLUMN position INT DEFAULT NULL;

替换your_table_name为实际表名

2. 按分组填充position值

利用MySQL 8.x原生支持的窗口函数ROW_NUMBER(),实现分组内从0开始的序号填充:

UPDATE your_table_name t
JOIN (
    SELECT 
        id,
        ROW_NUMBER() OVER (PARTITION BY parent_fk ORDER BY id) - 1 AS new_position
    FROM your_table_name
) AS sub ON t.id = sub.id
SET t.position = sub.new_position;
  • PARTITION BY parent_fk:按父键分组处理
  • ORDER BY id:按主键id保证行顺序稳定(若无需固定顺序,可替换为ORDER BY (SELECT 1),但主键排序更可靠)
  • ROW_NUMBER() - 1:将默认从1开始的序号转为从0起始

验证填充结果

SELECT id, name, parent_fk, position 
FROM your_table_name 
ORDER BY parent_fk, position;

内容的提问来源于stack exchange,提问作者E-Riz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 08:40:56