如何在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
相关产品推荐
相关产品推荐

