[英]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.