IDENTITY
列值是不可變的。
但是,可以切換表元數據以刪除IDENTITY
屬性,執行更新,然後切換回來。
假設下面的結構
CREATE TABLE Test
(
ID INT IDENTITY(1,1) PRIMARY KEY,
X VARCHAR(10)
)
INSERT INTO Test
OUTPUT INSERTED.*
SELECT 'Foo' UNION ALL
SELECT 'Bar' UNION ALL
SELECT 'Baz'
然後,你可以做
/*Define table with same structure but no IDENTITY*/
CREATE TABLE Temp
(
ID INT PRIMARY KEY,
X VARCHAR(10)
)
/*Switch table metadata to new structure*/
ALTER TABLE Test SWITCH TO Temp;
/*Do the update*/
UPDATE Temp SET ID = ID + 1;
/*Switch table metadata back*/
ALTER TABLE Temp SWITCH TO Test;
/*ID values have been updated*/
SELECT *
FROM Test
/*Safety check in case error in preceding step*/
IF NOT EXISTS(SELECT * FROM Temp)
DROP TABLE Temp /*Drop obsolete table*/
在SQL Server 2012中,可以有也可以用SEQUENCES
更直截了當地更新自動遞增列
CREATE SEQUENCE Seq
AS INT
START WITH 1
INCREMENT BY 1
CREATE TABLE Test2
(
ID INT DEFAULT NEXT VALUE FOR Seq NOT NULL PRIMARY KEY,
X VARCHAR(10)
)
INSERT INTO Test2(X)
SELECT 'Foo' UNION ALL
SELECT 'Bar' UNION ALL
SELECT 'Baz'
UPDATE Test2 SET ID+=1
以及如何從代碼做到這一點? – 2009-04-15 12:52:24
如果您手動進行更改,則可以要求管理器爲更改生成SQL腳本(表設計器菜單,生成更改腳本)。對於此更改,它將創建一個新表並將數據複製,然後刪除原始數據。 – 2009-07-27 09:57:39
@tomaszs - 一個代碼示例也更有效,因爲它根本不重建物理表(這樣做會這樣做兩次)在我遲來的答案[here](http://stackoverflow.com/a/17249583/ 73226) – 2013-06-22 10:19:00