簡體   English   中英

身分有時為SEED,有時為SEED +1

[英]Identity sometimes SEED, sometimes SEED +1

我們對具有預填充數據的測試數據庫進行引誘測試。 但是,有時對於特定的測試,我們想添加額外的數據。 為了不弄亂現有數據(除非是有意的),我們希望以ID 300001開始額外的條目。

USE DB

EXEC sp_MSForEachTable @command1 = 

'IF OBJECTPROPERTY(object_id(''?''), ''TableHasIdentity'') = 1
BEGIN
 DBCC CHECKIDENT (''?'', RESEED, 300000);
 DBCC CHECKIDENT (''?'', RESEED, 300000);
END'
GO

但是,在發生這種情況后插入新條目之后,某些表將分發ID 300000,一些表將分發300001,這使測試變得更加困難。

有誰知道為什么會這樣嗎? 還是可以繞開這個問題?

親切的問候,湯姆

根據MSDN:

當前身份值設置為new_reseed_value。 如果自創建表以來未將任何行插入表中,或者使用TRUNCATE TABLE語句刪除了所有行,則在運行DBCC CHECKIDENT之后插入的第一行將使用new_reseed_value作為標識。 否則,插入的下一行將使用new_reseed_value +當前增量值。

因此,如果要保持一致的行為,請在重新播種之前從每個表中插入一行或從其中刪除一行。

但是,我想指出的是,您不應該依賴具有任何模式的身份列。 盡管在實踐中身份會表現某種方式,但並不能保證一定能做到。 一個典型的場景是事務A創建一些新行,事務B創建更多行,然后回滾事務A並提交B會產生間隙。

除了Luaan的答案外,您還可以使用

 set identity_insert [tablename] on 

並通過insert語句手動設置標識值

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM