2012-08-22 28 views
3

我注意到SQL Sever(2008 express)在插入自動遞增身份規範時是隨機向前跳躍的。SQL服務器標識規範不連續

例如,我的一列「HitStat_ID」將按順序插入15,16,17,18,然後突然之間,它將決定跳轉到,比如說1012,1013,1014 ....然後9120, 9121等

真的並不重要,只要他們是獨特的(他們是),但它爲什麼會這樣做?它也在不止一張桌子上... 奇怪的是,這只是在上週左右完成的,但應用程序已經開發了好幾個月了!

ETA:IM在ASP.NET VB 工作這是插入(在這種情況下):

sql = "INSERT INTO [HitStats] ([PageName], [Date_and_Time], [User_ID]) values ('Home',  
'" + TheDateTime + "', '" + Session("User_ID") + "')" 
Dim dbcmd As SqlCommand = New SqlCommand(sql, dbconn) 
dbcmd.ExecuteNonQuery() 
dbcmd.Dispose() 

請不要繼續有關SQL注入等等等等,它不會發生的!

+2

你是否從表中刪除了數據?如果是這樣,那麼數字不會重置,除非您截斷表。 – Taryn

+0

@bluefeet - 是的,但只說10行,沒有像數字中的巨大差距。 –

回答

5

如果您使用的是應用程序和事務,當您回退事務時,您將失去生成的自動遞增數字。 另外,如果你做一些插入和回滾它們。

查看更多here

另外,如果你刪除數據,你就不會再得到所產生的數字,除非你做了補種。 請參閱here

+0

它是一個ASP.net web應用程序,使用標準的SQL插入單列,老實說,我不知道你的意思是交易,或回滾??! –

+0

一個事務讓你可以作爲一個單元執行一些代碼塊,如果你得到一個錯誤,回滾(取消)所做的更改,就像沒有任何事情發生(沒有插入)一樣。如果您使用的是存儲過程,有許多方法可以做到這一點,從c#代碼或sql。也許你在不知情的情況下用c#來做這件事。看到這裏http://www.c-sharpcorner.com/UploadFile/dchoksi/transaction02132007020042AM/transaction.aspx –

+1

每當你做一次回滾,上帝殺死一個自動生成的數字。對數字 –

0

如果正在複製數據庫並使用Automatic Identity Range Management,這樣的間隔並不少見。

會發生什麼情況是將身份值塊交給涉及複製的每個服務器,以便他們可以在不必與其他服務器通信的情況下發送身份值。一旦某個塊在服務器上用完,它將「跳轉」到已經分配給它的下一個塊,這可能會用於更高範圍的值。

+0

這樣做肯定沒有複製,只有我的開發機器上有一個服務器實例。 雖然很好的答案! –

0

@ElVieejo上關於「失敗的插入」的+1。另一種可能性,某人或某事可能會添加特定值(SET IDENTITY_INSERT ON) - 這可能解釋了很大的差距。

+0

不錯的想法,但是sql語句只插入了2個其他字段,而不是標識字段。 # –