SQL Server更新需求:按MainJob_Id分组为Container_TypeId赋值连续序号
嘿,这个需求其实就是咱们常遇到的分组内连续编号场景,我给你整理了几种主流SQL数据库的实现方案,你可以根据自己用的数据库来挑:
方案一:SQL Server / Azure SQL
用ROW_NUMBER()窗口函数就能轻松搞定,核心是按MainJob_Id分区,再指定一个稳定的排序列(比如表的主键或者创建时间,保证编号顺序固定):
UPDATE j SET Container_TypeId = rn FROM ( SELECT MainJob_Id, Container_TypeId, ROW_NUMBER() OVER (PARTITION BY MainJob_Id ORDER BY Job_Id) AS rn FROM Job ) j;
小提醒:如果没有明确的排序依据,一定要指定一个不会变的列(比如主键
Job_Id),不然每次执行可能会得到不同的编号顺序哦。
方案二:MySQL 8.0+
MySQL 8.0及以上版本支持窗口函数,写法和SQL Server类似:
UPDATE Job j JOIN ( SELECT Job_Id, ROW_NUMBER() OVER (PARTITION BY MainJob_Id ORDER BY Job_Id) AS rn FROM Job ) sub ON j.Job_Id = sub.Job_Id SET j.Container_TypeId = sub.rn;
要是你用的是MySQL 5.x这类老版本,不支持窗口函数的话,可以用变量来实现:
SET @prev_mainjob = NULL; SET @row_num = 1; UPDATE Job SET Container_TypeId = CASE WHEN MainJob_Id = @prev_mainjob THEN @row_num := @row_num + 1 ELSE @row_num := 1 AND @prev_mainjob := MainJob_Id END ORDER BY MainJob_Id, Job_Id;
方案三:PostgreSQL
PostgreSQL的写法也很直观,结合子查询和窗口函数就行:
UPDATE Job SET Container_TypeId = sub.rn FROM ( SELECT Job_Id, ROW_NUMBER() OVER (PARTITION BY MainJob_Id ORDER BY Job_Id) AS rn FROM Job ) sub WHERE Job.Job_Id = sub.Job_Id;
额外注意事项
- 执行更新前一定要备份好数据,避免误操作导致数据丢失;
- 如果
Container_TypeId是新增的列,得先执行添加列的语句:ALTER TABLE Job ADD COLUMN Container_TypeId INT;
内容的提问来源于stack exchange,提问作者Akhileshkumar singh
相关产品推荐
相关产品推荐

