SQLite數據庫中rowid使用
SQLite中每個表都默認包含一個隱藏列rowid
,使用WITHOUT ROWID
定義的表除外。通常情況下,rowid
可以唯一的標記表中的每個記錄。表中插入的第一個條記錄的rowid
爲1,後續插入的記錄的rowid
依次遞增1。即使插入失敗,rowid
也會被加一。所以,整個表中的rowid
並不一定連續,即使用戶沒有刪除過記錄。
由於唯一性,所以rowid
在很多場合中當作主鍵使用。在使用的時候,select * from tablename
並不能獲取rowid
,必須顯式的指定。例如,select rowid as myrowid, * from tablename
纔可以獲取rowid
列。查詢rowid
的效率非常高,所以直接使用rowid
作爲查詢條件是一個優化查詢的好方法。
但是rowid
列作爲主鍵,在極端情況下存在隱患。由於rowid
值會一直遞增,如果達到所允許的最大值9223372036854775807後,它會自動搜索沒有被使用的值,重新使用,並不會提示用戶
。這時,使用rowid
排序記錄,會產生亂序,並引入其他的邏輯問題。所以,如果用戶的數據庫存在這種可能的情況,就應該使用AUTOINCREMENT
定義主鍵,從而避免這種問題。使用AUTOINCREMENT
設置自增主鍵,雖然也會遇到9223372036854775807問題,但是它會報錯,提示用戶,避免產生rowid
所引發的問題。