我們在使用SQlServer2012數據庫的時候,當數據庫實例被重啟后,表里的IDENTITY類型的字段,實際的跳轉取決于該字段的類型,如果是INT類型,自動跳轉為1000,如果是bigint,跳轉為10000,從我們程序開發的角度,這個是無法接受的,目前只是在SQLServer2012種出現,其他版本的沒有出現。
就在幾天前,我們的一個工程師聲稱,我們一個IDENTITY列的值直接增加了10000,本來應該是2200現在是12001,現在我們必須解決這個問題。
按照道理,每次跳轉的值不應該改變,于是開始找原因,最后解決了該問題。
我們進行問題重現。
我們安裝一臺新的SQL Server 2012的測試服務器,并且創建一個測試數據庫。然后創建一個包含IDENTITY列的表:
create table MyTestTable(Id int Identity(1,1), Name varchar(255));
現在插入兩條數據:
insert into MyTestTable(Name) values ('Mr.Tom');
insert into MyTestTable(Name) values ('Mr.Jackson');
然后通過下面的查詢語句得到
SELECT Id, Name FROM MyTestTable;
目前的結果沒有問題,現在我們只需要重啟SQLServer服務,現在我們從SQL Server Management Studio重啟服務。
現在我們將向這個表繼續插入兩條數據。
insert into MyTestTable(Name) values ('Mr.Tom2');
insert into MyTestTable(Name) values ('Mr.Jackson2');
這個時候進行數據查詢,結果就成這樣了:
當SQLServer2012的服務重啟后,則標識從1002開始,這意味著它跳了1000,如果將字段設置為bigint,它會條高10000。
怎么會這樣呢,如何解決,難道是bug,但是在咨詢后,微軟聲稱這個不是bug,是一個新的功能,在某些情況下可以受益,但是對我們來說這個是不允許的,因為客戶端如果看到這樣的數據,肯定會覺得是一個問題,現在跳轉的數量取決于服務重啟的次數,如果這個值在客戶端不被看到,到還好,如果被看到,那肯定需要處理。
解決方法有兩個
1:使用序列
2:配置數據庫實例的啟動參數
1:使用序列
現在我們移除Identity字段,然后創建一個序列字段,并插入值。
CREATE SEQUENCE Id_Sequence
AS INT
START WITH 1
INCREMENT BY 1
MINVALUE 0
NO MAXVALUE
NO CACHE
2:修改數據庫實例的啟動參數
然后修改SQLServer啟動參數,打開SQLServer configuration manager,然后選擇服務實例,點擊右鍵屬性,查看實例的屬性界面,然后啟動參數選項輸入-t272,然后保存數據后重啟服務。這樣就可以看到差別。
這兩個方法都可以解決,但是第一種方法可以對某一個庫進行解決,而第二個修改后,將影響整個數據庫。
如果需要調整整個數據庫,那么可以使用第二個解決方法。