2014-04-26 40 views
1

我有一個包含56行的表。添加新行從ID 59開始。添加新行時跳過一些值的標識列

如何繼續使用ID 57?

+4

需要補種id列... http://blog.sqlauthority.com/2007/03/15/sql-server-dbcc-reseed-table-identity-value-reset-table-身份/ – Milen

回答

2

當您從表格中刪除一列或將標識更改爲較高數字時,會發生這種情況。

可以重置身份,但除非您有充分的理由這樣做(理由很可能是刪除了大部分表內容),否則我不會推薦這麼做。

如何補種身份的一些細節,可以發現here

,並使用它的方式是

DBCC CHECKIDENT (table_name, RESEED, new_reseed_value) 

其中new_reseed_value將57這個特定的情況下(即身份將啓動從57)。但是,請注意,如果ID高於57的表中有某些內容會失敗。

備選地,可以使用:

SET IDENTITY_INSERT Table_Name ON 
INSERT INTO Table_Name(ID, Other_Columns,You_Are_Inserting,You_Must_Specify_All_Of_Them) 
VALUES (57, 'SomeData','OtherData',...) 
SET IDENTITY_INSERT Table_Name OFF 

這將允許通過特別指定標識列值,而無需再接種插入。此外,請勿插入比您當前身份更高的值,否則您將在插入時遇到問題。

+1

僅供參考,僅重新啓動2012實例就可能產生差距,最多可達1000個寬度,這稱爲「性能優化」,另一個原因是從未暴露數據庫之外的身份。還有一件事:如果表中的身份大於重新設定的值,則RESEED不會失敗。只要對列沒有PK/UQ約束(通常是,OK ..),身份對於重複也很滿意,請自己嘗試。 – dean

0

這是IDENTITY列的預期行爲。如果你想要連續的數字,你不應該使用它們,因爲每次你插入一個新行時,身份值會增加,但是如果你刪除最後一行,不會減少,如果你開始一個事務,它也不會減少,插入一個新行,然後回滾事務。

您可以使用DBCC CHECKIDENT命令來更改標識值,但實際上,您應該將列更改爲常規非標識列並管理自己代碼中的值。

0

對於特定的表格,您需要打開Identity_insert

SET IDENTITY_INSERT YourTableName ON 

Insert into YourTableName (IDField,rest of the column names) 
values (57, rest of the column values) 

SET IDENTITY_INSERT YourTableNAme OFF