簡體   English   中英

INSERT INTO語句,用於復制行和自動遞增非標識鍵ID列

[英]INSERT INTO statement that copies rows and auto-increments non-identity key ID column

給定一個包含三列的表

  1. ID(主鍵,非自動增量)
  2. 組ID
  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
)

這會導致PrimaryKey違規,因為它最終會多次重復使用相同的Max(ID)+1值。

我是否只能在T-SQL WHILE語句中使用一堆具有遞增計數器值的INSERT語句?

我也沒有選擇將ID轉換為自動遞增標識列,因為這會破壞我沒有源代碼的代碼。

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

用這個:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM