INSERT INTO语句,用于复制行和自动递增非标识键ID列

时间:2010-05-12 16:13:12

标签: sql tsql

给定一个有三列的表

  1. ID(主键,非自动增量)
  2. 的GroupID
  3. someValue中
  4. 我正在尝试编写一个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
    )
    

    这会导致PrimaryKey违规,因为它最终会多次重复使用相同的Max(ID)+1值。

    我是否只能在T-SQL WHILE语句中使用一堆具有递增计数器值的INSERT语句?

    我也没有将ID转换为自动递增标识列的选项,因为这会破坏我没有源代码的代码。

3 个答案:

答案 0 :(得分:11)

而不是+ 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
)

答案 1 :(得分:1)

WITH    q AS
        (
        SELECT  *,
                (
                SELECT  MAX(id)
                FROM    mytable
                ) + ROW_NUMBER() OVER () AS nid
        FROM    mytable
        WHERE   groupID = 1
        )
INSERT
INTO    mytable (id, groupid, somevalue)
SELECT  nid, 2, somevalue
FROM    q

答案 2 :(得分:1)

使用此:

INSERT INTO MyTable
(       [ID]
       ,[GroupID]
       ,[SomeValue]
)    
 SELECT ROW_NUMBER() OVER() + X.MaxID 
       ,@NewGroupID
       ,[SomeValue]
 FROM MyTable
 CROSS JOIN (SELECT MAX(ID) AS MaxID FROM MyTable) X 
 WHERE GroupID = @OriginalGroupID