2012-12-13 29 views
1

如何在打開數據庫後立即獲取特定表的最後自動增量值?這不是last_insert_rowid(),因爲沒有插入事務。換句話說,我想事先知道在爲特定表插入新行時將選擇哪個數字自動增量。如何獲取當前自動增量值

回答

1

這取決於如何定義autoincremented列。

如果列定義是INTEGER PRIMARY KEY AUTOINCREMENT,那麼SQLite將在名爲sqlite_sequence的內部表中保留最大的ID。

如果列定義不包含關鍵字AUTOINCREMENT,SQLite將使用其「常規」例程來確定新的ID。從documentation

通常的算法是給新創建的行中的ROWID,它比之前插入表中的最大的ROWID較大 之一。如果 該表最初是空的,則使用1的ROWID。如果 最大ROWID等於最大可能整數 (9223372036854775807),那麼數據庫引擎開始隨機選擇正數 候選ROWID,直到找到一個先前不使用的 。如果在合理次數的 嘗試後沒有找到未使用的ROWID,則插入操作將失敗,並顯示SQLITE_FULL錯誤。如果沒有明確插入 的負ROWID值,則自動生成的ROWID值將始終大於零。

我記得讀,對於沒有AUTOINCREMENT列,唯一正確的方式來確定下一個ID是VACUUM數據庫第一;這會將所有ID計數器重置爲該表+1中最大的現有ID。但是我再也找不到這個引用,所以這可能不再是真實的。


這麼說,我同意slash_rick_dot是事先獲取自動遞增的ID是一個壞主意,特別是如果有非常小的機會另一個進程可能在同一時間寫入數據庫。

+0

根據sqlite文檔,應該設置「INTEGER」和「PRIMARY KEY」以便引擎自動增加值。我試圖設置'AUTOINCREMENT',但它不起作用。 – Pablo

+0

我有數據庫的獨佔訪問權限,沒有其他進程可以訪問數據庫。 – Pablo

+0

@Pablo:是的,對於成爲ROWID的別名的密鑰,它總是需要是「INTEGER PRIMARY KEY」。添加'AUTOINCREMENT'關鍵字只會改變下一個ID的計算方式。它的工作原理與[documentation](http://www.sqlite.org/faq.html#q1)中所述完全相同。 – Martijn

1

不同的數據庫實現不同的自動增量。但據我所知,他們都不會回答你所問的問題。

自動增量功能旨在爲新添加的表格行創建唯一的ID。如果一行還沒有被插入,那麼該特徵還沒有產生該id。

它是有道理的......如果你確實得到了下一個自動增量編號,你會怎麼做呢?可能意圖是將其分配爲尚未插入的新行的主鍵。但是,在獲取id的時間和用於插入行的時間之間,數據庫可能使用該id爲另一個進程插入行。

您的選擇是這樣的:自己管理ID的創建,或者等到插入行之後再使用自動創建的標識符。