2016-05-29 39 views
0

我對SQL和數據庫很陌生,有一件事困擾着我。SQL Server:主鍵自動增量 - 刪除的行和空閒鍵值是什麼?

我爲我的ASP.NET MVC項目使用SQL Server,我的數據庫及其表是由實體框架使用代碼優先方法自動生成的。

我有一個書籍收藏表 - 只有CollectionIdName列。 在開發過程中,我在此表中進行了許多插入和刪除,現在它有10行,Id的1到10(最初的條目)。但是,當我添加一個新的時,它的Id設置爲37.顯然以前有Id到36的條目,但現在已經消失,這些數字似乎是免費的。

那麼爲什麼新條目沒有將Id設置爲11?這是一種限制還是安全功能?

謝謝你的回答。

+0

https://www.google.ge/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=sql%20server%20identity%20reuse –

+4

你應該永遠不會***「重複使用「或」回收「以前使用過的自動生成的值。想象一下,在某個地方有一個審計表可以跟蹤實體的創建情況 - 如果您在第一個對象被刪除時回收該Id,那麼您如何從6個月後開始說明Id = 11屬於哪個對象,它後來出現了一個新的,完全獨立的完全獨立的對象?自動生成的ID - 一旦發佈 - 完成,消失,再也不會被重複使用! –

回答

0

這是我們定義標識列時的默認行爲。每當我們執行刪除操作時,標識列的記錄都會有空白。從MSDN

如果已存在頻繁缺失的表標識列

備註,間隙可標識值之間發生。如果這是 問題,請不要使用IDENTITY屬性。但是,爲確保 未創建間隙或填補現有間隙,請在使用IDENTITY_INSERT ON明確輸入之前先評估現有標識值。

IDENTITY

0

除了對方的回答,它也有與服務器的性能做。服務器通常在內存中緩存一組ID,以使分配速度更快,因爲下一個數字必須存儲在磁盤的某處。因此,如果服務器一次分配100個號碼,則只需在身份的每100次使用(插入)中寫入磁盤1。

試圖保持序列中的差距會吸了很多時間。

如果您創建一個新表,插入一行,殺死服務器並重新啓動,您會發現下一個插入將很可能包含任何數量的緩存值所包含的間隙。