例如,如果我有一個自動編號的字段,我會添加新記錄而不指定此字段,並讓DB引擎爲我選擇它。
那麼,它會選擇刪除的記錄的號碼?如果是,何時?數據庫中已刪除記錄的數字主鍵是否會被重新用於未來的新記錄?
// SQL Server,MySQL。 //
後續問題:What happens when DB engine runs out of numbers to use for primary keys?
例如,如果我有一個自動編號的字段,我會添加新記錄而不指定此字段,並讓DB引擎爲我選擇它。
那麼,它會選擇刪除的記錄的號碼?如果是,何時?數據庫中已刪除記錄的數字主鍵是否會被重新用於未來的新記錄?
// SQL Server,MySQL。 //
後續問題:What happens when DB engine runs out of numbers to use for primary keys?
NO。數字主鍵不會被重複使用,除非您手動指定它們(您應該避免這種情況!)
取決於自動編號系統。如果您使用的是任何類型的序列,刪除的記錄數量將不會被重用,因爲序列不知道它們。
通常,不,數字不會被重複使用。
但是,您可以在像Oracle這樣的產品中指定一個循環週期並重復使用數字的序列生成器。
無論是否有刪除記錄的數字是您的應用程序的問題。
不具體。如果從序列或自動增量標識列讀取密鑰,則該序列將插入併產生下一個值。但是,只要不違反唯一性約束,就可以取消激活此(SQL Server上的set identity_insert on
),並將該列中的任意數字放入列中。
+1,對SQL Server有一個小的更正/警告 - 要將值插入標識列,必須在插入顯式標識值之前指定SET IDENTITY_INSERT ON(請參閱http://msdn.microsoft.com/zh-cn/library/ms188059.aspx)。 – 2008-10-31 14:11:28
謝謝。發現得好。 – ConcernedOfTunbridgeWells 2008-10-31 20:08:30
這個問題需要進行更精確:
... 「與Oracle序列」
... 「與MySQL自動編號列」
...等...
我已經指定了兩個我感興趣的引擎。 – 2008-10-31 13:55:18
只要您正確創建表格,您就不會重複使用數字。 但是你可以通過使用(反正在MSSQL中)補種標識列如下:
- 輸入表中未下一個號碼使用
DBCC CHECKIDENT最後的有效輸入的數量([表名],RESEED,[NumberYouWantToStartAt])
這當然是瘋狂的......,絕不應該做的:)
MySQL不會重複使用的ID,除非你truncate
表或delete from
表沒有where
條款(在這種情況下,MySQL,內部只是做了一個truncate
)。
AFAIK,這可能發生在MySQL:
How AUTO_INCREMENT Handling Works in InnoDB:只要
InnoDB使用在內存中的自動增長計數器作爲服務器運行。如上所述,當服務器停止並重新啓動時,InnoDB將第一個INSERT的每個表的計數器重新初始化爲表,如前所述。
After a restart of server. Innodb reuse previously generated auto_increment values. :
建議的修復:後 重啓 InnoDB表不應該失去未來數爲AUTO_INCREMENT列軌道。
是的,它真的取決於你生成id的方式。
例如,如果您使用GUID作爲主鍵,那麼獲取隨機新Guid的大多數實現都不可能再次選擇另一個GUID,但它會給予足夠的時間,並且如果GUID不在表中,插入語句會很好,但如果已經有一個GUID,你會得到一個主鍵約束衝突。
我認爲MySQL的重用id的功能是一個bug。
考慮類似文件上傳的處理。使用數據庫ID作爲文件名是一個很好的做法:簡單,沒有與用戶提供的文件名功勳風險等
你不能真正使一切事務,當文件系統被捲入,你將會有提交數據庫事務然後寫入文件,或寫入文件並提交數據庫事務,但是如果其中一個或兩個失敗,或者您有崩潰,或者您的網絡文件系統有問題,那麼您可能在數據庫中有有效的記錄沒有文件或沒有數據庫記錄的文件,因爲這個東西不是原子的。
如果發生這樣的問題,並且服務器回來時第一件事是覆蓋回滾事務的id和文件,它會很糟糕。這些文件可能是有用的。
不,想象一下,如果您的銀行決定重新使用您的帳戶ID - ARHHHH!
查看MartinBøgelund的答案。它們在某些情況下被重用。 – user984003 2013-02-07 15:27:38
Martins的回答是正確的,但它與單個數據庫引擎和罕見情況有關,顯然是一個錯誤(不知道他們是否打算修復它) – 2013-02-08 10:16:42