「rowid 表格」是 SQLite 架構中任何
rowid 表格的特色是它們都有唯一的非 NULL 符號 64 位元整數 rowid,用作底層 B 樹 儲存引擎中資料的存取金鑰。
rowid 表格的 PRIMARY KEY(如果有)通常不是表格的真正主鍵,因為它不是底層 B 樹 儲存引擎使用的唯一金鑰。此規則的例外情況是當 rowid 表格宣告 INTEGER PRIMARY KEY 時。在例外情況中,INTEGER PRIMARY KEY 會成為 rowid 的別名。
rowid 表格的 PRIMARY KEY 約束 (只要它不是真正的主鍵或 INTEGER PRIMARY KEY) 實際上與 UNIQUE 約束 相同。由於它不是真正的主鍵,因此 PRIMARY KEY 的欄位允許為 NULL,違反所有 SQL 標準。
rowid 表格的 rowid 可以透過讀取或寫入任何「rowid」、「oid」或「_rowid_」欄位來存取 (或變更)。但如果表格中有宣告的欄位使用這些特殊名稱,則這些名稱會指涉宣告的欄位,而不是基礎的 rowid。
透過 rowid 存取記錄經過高度最佳化,而且非常快速。
如果 rowid 沒有透過 INTEGER PRIMARY KEY 設定別名,則它不會持續存在,而且可能會變更。特別是 VACUUM 指令會變更未宣告 INTEGER PRIMARY KEY 的表格的 rowid。因此,應用程式通常不應直接存取 rowid,而應改用 INTEGER PRIMARY KEY。
在基礎的 檔案格式 中,每個 rowid 都儲存為 可變長度整數。這表示較小的非負面 rowid 值會佔用比較大的或負面的 rowid 值更少的磁碟空間。
上述所有複雜情況(以及在此未提及的其他情況)均源於需要維護數百億個流通中的 SQLite 資料庫檔案的向後相容性。在一個完美的世界中,不存在「rowid」這回事,所有表格都遵循標準語意,實作為 WITHOUT ROWID 表格,只不過沒有額外的「WITHOUT ROWID」關鍵字。不幸的是,生活很混亂。SQLite 的設計者對於目前的混亂狀況表示誠摯的歉意。
此頁面最後修改於 2022-01-08 05:02:57 UTC