2014-03-05 31 views
6

我有一個SQL表的屬性集合:SQL身份(1,1)從0開始

CREATE TABLE MyTable(
    MyTableID int IDENTITY(1,1) NOT NULL, 
    RecordName nvarchar(100) NULL) 

出事了這個表,導致奇怪的行爲。我需要找出什麼。

當插入發生時:

INSERT MyTable(RecordName) 
VALUES('Test Bug') 

SELECT SCOPE_IDENTITY() -- returns 0 
SELECT * FROM MyTable -- displays: 0, 'Test Bug' 

這是一個問題,因爲該插入上述代碼期望所述第一ID被1 - 我不能找出如何與IDENTITY(1,1)這個最終成爲0

如果(執行INSERT之前)我檢查的身份返回null:

DBCC CHECKIDENT (MyTable, NORESEED) 

檢查標識信息:當前標識值 'NULL',當前列值 'NULL'。

我知道幾種方法來解決這個問題;我需要知道桌子是如何進入這個狀態的呢?

我知道CHECKIDENT返回null是如果表剛剛創建的唯一途徑,但隨後IDENTITY(1,1)榮幸和INSERT導致SCOPE_IDENTITY()1

或者我可以得到0作爲下一個ID,如果我強迫-1作爲當前種子(DBCC CHECKIDENT (MyTable, RESEED, -1)SET IDENTITY_INSERT MyTable ON),但隨後的檢查報告說,當前-1種子(而不是零),這樣就不會發生了什麼。

怎麼數據庫進入其中列有IDENTITY(1,1)DBCC CHECKIDENT (MyTable, NORESEED)返回空的狀態,但未來INSERT原因SCOPE_IDENTITY()0

+0

我假設有一個觸發器表'MyTable'。 –

+0

@HamletHakobyan該表沒有觸發器。 – Keith

+0

重新創建表格後,您是否達到相同的結果? –

回答

9

我希望有人/東西已經運行:

DBCC CHECKIDENT ('dbo.MyTable', RESEED, 0); 

如果您運行以下命令:

CREATE TABLE dbo.MyTable(
    MyTableID int IDENTITY(1,1) NOT NULL, 
    RecordName nvarchar(100) NULL 
); 

DBCC CHECKIDENT ('dbo.MyTable', RESEED, 0); 
DBCC CHECKIDENT ('dbo.MyTable', NORESEED); 

第二CHECKIDENT仍返回NULL

檢查標識信息:當前標識值'NULL',當前列值'NULL'。

但是下一個標識值將是0。這是documented behaviour,MSDN規定:

當前標識值被設定爲new_reseed_value。 如果自表創建後沒有行插入到表中,則在執行DBCC CHECKIDENT後插入的第一行將使用new_reseed_value作爲標識。否則,插入的下一行將使用new_reseed_value + 1。如果new_reseed_value的值小於標識列中的最大值,則會在後續對該表的引用時生成錯誤消息2627。

上新創建/截斷表其中sys.identity_columnslast_value列仍然是NULL這隻作品。如上,如果你要插入行,刪除它描述,然後補種爲0,新的身份仍然是1

全面測試腳本

IF OBJECT_ID(N'dbo.T', 'U') IS NOT NULL 
    DROP TABLE dbo.T; 

CREATE TABLE dbo.T(ID INT IDENTITY(1,1) NOT NULL); 
INSERT dbo.T OUTPUT inserted.* DEFAULT VALUES; 
-- OUTPUTS 1 

DELETE dbo.T; 
DBCC CHECKIDENT ('dbo.T', RESEED, 0); 
INSERT dbo.T OUTPUT inserted.* DEFAULT VALUES; 
-- OUTPUTS 1 

TRUNCATE TABLE dbo.T; 
DBCC CHECKIDENT ('dbo.T', RESEED, 0); 
INSERT dbo.T OUTPUT inserted.* DEFAULT VALUES; 
-- OUTPUTS 0 
+0

乾杯!這就是問題所在 - 當他們應該調用DBCC CHECKIDENT(MyTable,RESEED)'時,有人稱DBCC CHECKIDENT(MyTable,RESEED,0)'。如果表格從未填充過,我還不知道仍然報告null爲當前標識。 – Keith

+0

@Keith你是不是故意說他們應該叫'DBCC CHECKIDENT(MyTable,NORESEED)'? –