如何在打開數據庫後立即獲取特定表的最後自動增量值?這不是last_insert_rowid()
,因爲沒有插入事務。換句話說,我想事先知道在爲特定表插入新行時將選擇哪個數字自動增量。如何獲取當前自動增量值
回答
這取決於如何定義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是一個壞主意,特別是如果有非常小的機會另一個進程可能在同一時間寫入數據庫。
不同的數據庫實現不同的自動增量。但據我所知,他們都不會回答你所問的問題。
自動增量功能旨在爲新添加的表格行創建唯一的ID。如果一行還沒有被插入,那麼該特徵還沒有產生該id。
它是有道理的......如果你確實得到了下一個自動增量編號,你會怎麼做呢?可能意圖是將其分配爲尚未插入的新行的主鍵。但是,在獲取id的時間和用於插入行的時間之間,數據庫可能使用該id爲另一個進程插入行。
您的選擇是這樣的:自己管理ID的創建,或者等到插入行之後再使用自動創建的標識符。
- 1. 直接獲取當前/增量遊標
- 2. 如何獲取插入的記錄的pkey值(自動增量)?
- 3. 從當前值重新執行SQL自動增量
- 4. 更改MySQL中的自動增量值的當前計數?
- 5. 獲取HSQLDB中自動增量變量的值
- 6. SQLite自動增量 - 如何插入值?
- 7. 從JDBC獲取自動增量Id
- 8. 獲取自動增量PK列
- 9. 使用insert_id獲取自動增量ID
- 10. MySql InnoDb自動增量預取值
- 11. 提前獲取自動遞增列的值
- 12. 如何獲取自動遞增字段
- 13. 如何獲取UISlider的當前值
- 14. 如何獲取當前GMT值?
- 15. 如何獲取RadGrid列的當前值
- 16. 如何動態獲取當前多頁標籤值的值?
- 17. 如何獲得自動增量列MVVM的下一個值
- 18. 如何自動增量ID
- 19. 如何自動增量(IDENTITY)
- 20. 如何使自動增量列非自動增量?
- 21. 補虛自動增量值
- 22. HashMap值自動增量
- 23. DDLUtils和自動增量值
- 24. 自動增量值觸發
- 25. 如何獲取要上傳記錄的ID(自動增量)?
- 26. 如何獲取插入的行自動增量id?
- 27. 從插入獲取最後一個自動增量值?
- 28. 獲取數據庫中的最後一個自動增量值
- 29. 可以通過自動增量pk獲取插入的值嗎?
- 30. 獲取自動增量列的值sqlite的
根據sqlite文檔,應該設置「INTEGER」和「PRIMARY KEY」以便引擎自動增加值。我試圖設置'AUTOINCREMENT',但它不起作用。 – Pablo
我有數據庫的獨佔訪問權限,沒有其他進程可以訪問數據庫。 – Pablo
@Pablo:是的,對於成爲ROWID的別名的密鑰,它總是需要是「INTEGER PRIMARY KEY」。添加'AUTOINCREMENT'關鍵字只會改變下一個ID的計算方式。它的工作原理與[documentation](http://www.sqlite.org/faq.html#q1)中所述完全相同。 – Martijn