由於DBs do not reuse numbers of deleted records可能會用完數字,特別是如果您對此列選擇的不是真正的大整數類型。
會發生什麼,以及如果不好,如何防止它呢?數據庫引擎用完主鍵時會發生什麼情況?
// SQL Server,MySQL發//
由於DBs do not reuse numbers of deleted records可能會用完數字,特別是如果您對此列選擇的不是真正的大整數類型。
會發生什麼,以及如果不好,如何防止它呢?數據庫引擎用完主鍵時會發生什麼情況?
// SQL Server,MySQL發//
我認爲正是發生將取決於你正在使用的數據庫引擎(甚至有可能是InnoDB和MyISAM之間的差異在MySQL中)。無論發生什麼,它都不會很漂亮。
您只需將列類型更改爲較大的整數。
For MySQL, it is documented that:
The behavior of the auto-increment mechanism is not defined if a user assigns a negative value to the column or if the value becomes bigger than the maximum integer that can be stored in the specified integer type.
是的,這是可能的:如果你只允許2位數的號碼,你可以只有ID最多99,依此類推。一旦達到限制,插入就會失敗。選擇合適的尺寸是一個常識問題。
最終會出現3+小時的停機時間,例如Slashdot的評論功能。
在Postgres中,「串行」類型等效於使用NO CYCLE選項創建SEQUENCE,並將該字段的默認值設置爲nextval。力竭這樣的序列產生一個錯誤:
http://www.postgresql.org/docs/8.3/interactive/sql-createsequence.html
大多數數據庫系統有一個數字數據類型,它可以是寬於32位。如果您預計超過2^32條記錄,則應使用適當的鍵寬。
它取決於你的數據庫,我相信MS SqlServer,你只是不能插入任何新的行,直到你解決問題。上次我遇到它時,我們通過重新將身份列重新設置爲1來解決問題。這顯然不是一個通用的解決方法,但它適用於我們的情況。
Oracle不支持自動增量ID列,標準做法是使用序列生成器。一個序列可以產生多達28位數的整數,所以如果你用完了那些......我想你有一張很大的桌子。但是,行爲將取決於序列生成器的配置 - 要麼是錯誤,要麼會循環回到開始值,並且在下一個插入操作中會出現違反PK約束的情況。
我以前在SQL 2000中試過這個。在Integer.MaxValue之後,下一個標識值是Integer.MinValue。然後,它會繼續按照您的預期計數。只要記錄曾經存在於1,2,3等已經到了那裏,沒有什麼不好的事情會發生。如果它運行到一個副本(並且該字段是主鍵),那麼插入失敗,併發生密鑰違例。我還沒有嘗試過一個不受限於唯一值的標識列。我猜想這對重複會很滿意。
通常你會得到一個錯誤。如果您偏執,請使用BIGINT。
順便說一句,你可能會最終重複使用已刪除記錄中的數字;閱讀我對前一個問題的回答... – 2008-10-31 14:11:53
謝謝。但是這個功能實際上是bug。 :| – 2008-10-31 14:18:08
它被報告爲一個錯誤,但錯誤報告的狀態顯示爲「不是一個錯誤」。所以它必須是一個功能:-) – 2008-10-31 14:25:07