2014-04-26 41 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