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

SQL Server基于指定起始值逐行生成连续ID用于INSERT查询

无自增列时手动生成连续ID实现批量插入

实现前提

  • 无法修改目标表结构配置标准自增序列,只能通过SQL语句生成待插入数据的ID值
  • 业务场景为每日单次执行插入操作,无需考虑并发插入导致的ID冲突问题

基础ID计算逻辑

首先查询目标表现有最大ID:

SELECT MAX(ID)
FROM 你的目标表名;

示例中该查询返回结果为16684,新插入数据的ID起始值即为最大ID加1,对应查询:

SELECT MAX(ID) + 1
FROM 你的目标表名;

示例返回起始ID为16685。

批量插入时连续ID生成方案

需求是在INSERT INTO ... SELECT语句中,以上述起始值为起点,给SELECT返回的每一行逐行生成连续递增ID,最终插入效果如下:

16685, Data, Data, Data
16686, Data, Data, Data
16687, Data, Data, Data
16688, Data, Data, Data
16689, Data, Data, Data
...

支持窗口函数的数据库(MySQL 8.0+、PostgreSQL、SQL Server、Oracle等)

直接用ROW_NUMBER()窗口函数给待插入结果集生成连续行号,和最大ID相加即可得到连续递增ID,写法如下:

INSERT INTO 你的目标表名 (ID, 其他列1, 其他列2, 其他列3)
SELECT
    (SELECT MAX(ID) FROM 你的目标表名) + ROW_NUMBER() OVER (ORDER BY 业务指定的排序字段) AS ID,
    其他列1,
    其他列2,
    其他列3
FROM 你的查询数据源/关联查询逻辑;

逻辑说明:

  • 子查询会先获取当前表的最大ID值,作为ID计算基数
  • ROW_NUMBER()会按照OVER子句中指定的排序规则,给查询返回的每一行生成从1开始的连续序号,和基数相加后,第一行ID为MAX(ID)+1、第二行为MAX(ID)+2,正好匹配连续递增的需求
  • OVER中的排序字段需根据业务规则选择,比如创建时间、数据源主键等,保证ID生成顺序符合预期

不支持窗口函数的旧版数据库(以MySQL 5.x为例)

可以通过用户变量累加的方式生成连续ID,写法如下:

-- 先初始化ID基数为当前表最大ID
SET @current_id = (SELECT MAX(ID) FROM 你的目标表名);

INSERT INTO 你的目标表名 (ID, 其他列1, 其他列2, 其他列3)
SELECT
    @current_id := @current_id + 1 AS ID,
    其他列1,
    其他列2,
    其他列3
FROM 你的查询数据源/关联查询逻辑
ORDER BY 业务指定的排序字段;

内容的提问来源于stack exchange,提问作者Mike - SMT

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 23:42:19