一尘不染

INSERT INTO语句,用于复制行并自动增加非身份键ID列

sql

给定一个具有三列的表

  1. ID (Primary Key, not-autoincrementing)
    2.GroupID
    3.SomeValue

我正在尝试编写单个SQL INSERT INTO语句,该语句将具有一个GroupID的每一行的副本复制到新的GroupID中。

起始表示例:

ID | GroupID | SomeValue
------------------------
1  |    1    |    a
2  |    1    |    b

运行简单的INSERT INTO语句后的目标:

ID | GroupID | SomeValue
------------------------
1  |    1    |    a
2  |    1    |    b
3  |    2    |    a
4  |    2    |    b

我以为我可以做这样的事情:

INSERT INTO MyTable
(       [ID]
       ,[GroupID]
       ,[SomeValue]
)
(
SELECT (SELECT MAX(ID) + 1 FROM MyTable)
       ,@NewGroupID
       ,[SomeValue]
 FROM MyTable
 WHERE ID = @OriginalGroupID
)

这将导致一次主键冲突,因为它将最终多次重用相同的Max(ID)+1值。

我唯一的求助对象是T-SQL WHILE语句中具有递增的Counter值的一堆INSERT语句吗?

我也没有选择将ID转换为自动递增的Identity列,因为那样会破坏我没有源代码的代码。


阅读 169

收藏
2021-05-16

共1个答案

一尘不染

代替+ 1,添加行号。我还修复了您的WHERE子句中的错误(应该是GroupID =,而不是ID =):

INSERT INTO MyTable
(       [ID]
       ,[GroupID]
       ,[SomeValue]
)
(
    SELECT
       (SELECT MAX(ID) FROM MyTable) + ROW_NUMBER() OVER (ORDER BY GroupId),
       @NewGroupID,
       [SomeValue]
    FROM MyTable
    WHERE GroupID = @OriginalGroupID
)
2021-05-16