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

如何在INSERT INTO语句中插入表中的非连续ID

如何将table1的非连续ID按顺序插入table2?

你的需求很明确:要把table1里那些非连续的ID,按顺序插入到table2中,同时让table2的Id列生成连续的序号,另外Value1固定为67,Date用当前日期。

你之前尝试的while循环思路有问题——它只是单纯按table1的行数循环插入,但没有关联到table1里的具体数据,自然没法拿到对应的ID。其实根本不用这么麻烦,用INSERT...SELECT配合窗口函数就能一步搞定,而且效率比循环高得多。

方法一:手动生成连续的Id列

如果table2的Id不是自增主键,你可以用ROW_NUMBER()窗口函数来生成连续的序号:

INSERT INTO table2 (Id, Value1, Value2, Date)
SELECT 
    ROW_NUMBER() OVER (ORDER BY t1.Id) AS Id,
    67 AS Value1,
    t1.Id AS Value2,
    GETDATE() AS Date
FROM table1 t1
ORDER BY t1.Id;

这段代码的逻辑是:

  • ROW_NUMBER() OVER (ORDER BY t1.Id):按照table1的Id排序,给每一行分配一个连续的数字,作为table2的Id
  • 固定Value1为67,Value2直接取table1的Id
  • GETDATE()获取当前系统日期填充Date列

方法二:利用自增主键自动生成Id

如果table2的Id列已经设置为自增主键(IDENTITY),那你完全不用手动生成Id,数据库会自动帮你创建连续序号,代码可以简化成:

INSERT INTO table2 (Value1, Value2, Date)
SELECT 
    67 AS Value1,
    t1.Id AS Value2,
    GETDATE() AS Date
FROM table1 t1
ORDER BY t1.Id;

为什么你的while循环不行?

你原来的循环只是执行count(*)次插入,但每次插入时没有指定要获取table1哪一行的Id——循环变量@value只是计数,和table1的实际数据没有关联,所以根本拿不到正确的Id值。而且这种逐行插入的方式,在数据量较大时性能远不如批量的INSERT...SELECT。

内容的提问来源于stack exchange,提问作者graphene

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:57:30