2017-08-10 78 views
1

在SQL Server 2012中,以下查询将播种来自2而不是1的标识列myTable_id。为什么? myTable_id也是PK。DBCC CHECKIDENT(myTable,RESEED,1)从2重新播种

DELETE FROM myTable; 
GO 
SELECT * FROM myTable --0 rows are returned as expected 
GO 
DBCC CHECKIDENT(myTable, RESEED,1) 
GO 
INSERT INTO myTable(col1,col2,col3) SELECT FROM AnotherTable(col1,col2,col3) 
GO 
SELECT * FROM myTable --1005 rows are returned as expected, but identity value starts from 2 
GO 

备注

  1. 插入的数据是正确的,唯一的问题是新插入的数据从2代替1
  2. 开始在上面的SQL代码,如果我使用DBCC CHECKIDENT(myTable, RESEED,0)身份列正确地从1开始。
  3. 以下是针对myTable_id列的SSMS中的快照:

enter image description here

+0

DBCC CHECKIDENT(myTable,RESEED,0) – mohan111

+0

我会想象因为重新播放到1意味着它认为它已经具有1的值,所以下一个应该是2.也就是说,在这种情况下它是零,而不是基于1这可能是更直观的给定身份的默认行为 – Xedni

回答

1

docs

的种子值是插入到标识列加载到表中的第一个行的值。所有后续行都包含当前标识值加上递增值,其中当前标识值是为表或视图生成的最后一个标识值。

所以如果是从10种子,要被插入的下一个值将是11。

+1

这很令人困惑,因为如果表已被截断'd,它将从10开始,而不是从11开始:“如果自表创建后没有行插入到表中,或者如果使用TRUNCATE TABLE语句删除了所有行,则在运行DBCC CHECKIDENT之后插入的第一行将使用new_reseed_value作为标识。“ – Blorgbeard

+0

@DavidG。是的,但是如果当前值什么都没有(如上面的代码所示)下一个插入的应该是1,是正确的?因为,文档中的示例C指示当前值是10,下一个插入的值是11.我可能在这里误解了什么? – nam

+0

'DBCC CHECKIDENT(myTable,RESEED,1)'将“当前值”设置为1. – Blorgbeard

相关问题