2012-05-23 27 views
2

我知道sqlite數據庫會自動爲每個插入的記錄生成一個唯一的id(autoincrement)。用盡sqlite數據庫中的唯一ID

有誰知道在執行替換查詢時是否有任何可能用完sqlite3數據庫中的系統唯一ID?

我的意思是說數據庫中的每一塊數據都有自己的類型。例如,系統唯一ID就像int一樣。如果數據庫生成的唯一ID等於MAX_INT,數據庫將如何處理下一條記錄?

謝謝。

回答

7

最大可能的ID是9223372036854775807(2^63 - 1)。在任何情況下,如果它找不到新的自動增量主鍵,它將返回SQLITE_FULL。

還有一個重點。如果使用INTEGER PRIMARY KEY,它可以重用先前在表中但已被刪除的鍵。如果使用INTEGER PRIMARY KEY AUTOINCREMENT,則永遠不能重新使用自動遞增鍵。

+0

我明白了。正如我所看到的 - 我不擁有這個ROWID。當我從文檔中讀取:如果我有一個整數自動增量列,它將是此表的ROWID的別名,並且ROWID也將是自動增量。如果我沒有autoincrement列(只是一個主鍵整數) - ROWID也只是主鍵整數。 但在我的表中我沒有任何整數主鍵。什麼類型的關鍵是ROWID?它會自動增加嗎? 非常感謝 –

+0

@msj,我相信如果你沒有明確聲明任何一種INTEGER PRIMARY KEY,它將使用[從這裏]的最高算法(http://www.sqlite.org/autoinc.html)。但是,您只能通過「ROWID」訪問它。 –

+0

我也想相信。感謝您的答案。 –

6

http://www.sqlite.org/autoinc.html

「如果最大ROWID等於最大可能的整數(9223372036854775807),則數據庫引擎開始於隨機挑選陽性候選的ROWID,直到找到了以前沒有的一個。如果沒有未使用的ROWID能經過合理次數的嘗試後,插入操作將失敗,並出現SQLITE_FULL錯誤。如果沒有顯式插入負的ROWID值,則自動生成的ROWID值將始終大於零。

鑑於sqlite id是64位的,你可以在用完之前每100毫秒插入一個新的記錄(我補充了這些數字;但你明白了)。

+3

它實際上是2.92277266×10^10年([100 ms * 9223372036854775807 in years](https://www.google.com/search?q=100%20ms%20*%209223372036854775807%20in%20years)) –

相關問題