我先做了一些搜索,但仍然有一個問題。在SQLite表中檢索最後的記錄(再次)
不久之後,我發現的最佳答案是在this SO回答。總結:
SELECT * FROM TABLE WHERE ID = (SELECT MAX(ID) FROM TABLE);
我想知道的是,如果下面的方法一樣好(因爲我懶得去改變它,我碰巧喜歡它)。
SELECT * FROM TABLE ORDER BY ID DESC LIMIT 1
按照SQLite Autoincrement文檔,我們有,
如果在插入指定ROWID,或者指定的ROWID具有NULL值,然後適當的ROWID會自動創建。 通常的算法是在插入之前爲新創建的行提供比表中最大ROWID大一個的ROWID。如果表格最初是空的,則使用1的ROWID。 [強調]
,並進一步,
上述將產生只要單調遞增獨特的ROWID,你從來沒有使用最大ROWID值,你永遠不刪除該條目中的正常ROWID選擇算法帶有最大ROWID的表。 如果您曾經刪除過行,或者曾經創建過可能具有最大ROWID的行,那麼創建新行時可能會重複使用先前刪除的行中的ROWID,並且新創建的ROWID可能不會嚴格按升序排列。 [加重點]
我對我提出的SQL語句的問題來自最後一句。它似乎表明,如果刪除任何行,則可以重新使用先前刪除的ROWID,而不管最大ROWID是否已被使用。如果我們假設從未使用過最大ROWID(無論是手動還是隻有那麼多記錄),那麼我們只需要擔心刪除記錄。在這種情況下,第一個SQLite文檔摘錄使它聽起來像你不會遇到任何問題與我的查詢。
有誰知道嗎?
我喜歡我的查詢,因爲它只涉及一個select(albiet,代價是訂單)。我想,我可能過分關注微小的優化,是不是?
編輯: 其實,重新審查上面引用的SQLite頁面,我認爲使用AUTOINCREMENT關鍵字可以保證單調遞增的ROWID。最後一節詳細討論了這一點。
如果列的類型爲INTEGER PRIMARY KEY AUTOINCREMENT,則使用稍微不同的ROWID選擇算法。爲新行選擇的ROWID至少比之前在同一個表中存在的最大ROWID大一個。如果表中以前從未包含任何數據,則使用1的ROWID。如果該表先前已經保留了一個具有最大可能ROWID的行,那麼不允許新的INSERT,並且任何插入新行的嘗試都將失敗,並出現SQLITE_FULL錯誤。
現在似乎很清楚。只是不能填滿表格(最大9223372036854775807)。
對不起,我只是早些時候剔除了這部分!
我沒有看到問題。你的邏輯對我來說很合理。重新使用ROWID的想法似乎是優化表空間和偏移量。 – 2012-08-01 19:40:23
如果您想保證選擇最後一行的方法,請使用時間戳而不是'ROWID'。 (假設你沒有及時出行或將系統時鐘設置爲過去) – Sam 2012-08-01 19:42:08
@Sam可能會比我的方法更好,因爲使用Autoincrementing rowid字段會使插入速度變慢。雖然,對於大多數應用程序,我敢打賭,這並不重要。 – CatShoes 2012-08-01 19:59:51