2017-08-10 46 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

相關問題