小巧、快速、可靠。
選擇其中三項。

SQLite C 介面

最後插入的 Rowid

sqlite3_int64 sqlite3_last_insert_rowid(sqlite3*);

大多數 SQLite 資料表(WITHOUT ROWID 資料表除外)中的每個項目都有一個唯一的 64 位元帶符號整數鍵,稱為 "rowid"。只要這些名稱沒有被明確宣告的欄位使用,rowid 就始終可以作為名為 ROWID、OID 或 _ROWID_ 的未宣告欄位使用。如果資料表有一個 INTEGER PRIMARY KEY 類型的欄位,則該欄位是 rowid 的另一個別名。

sqlite3_last_insert_rowid(D) 介面通常會傳回資料庫連線 D 上最近一次成功 INSERT 至 rowid 資料表或 虛擬資料表rowid。插入 WITHOUT ROWID 資料表的操作不會被記錄。如果資料庫連線 D 上從未成功 INSERT 至 rowid 資料表,則 sqlite3_last_insert_rowid(D) 會傳回零。

除了在將資料列插入資料庫資料表時自動設定之外,這個函式傳回的值也可以透過 sqlite3_set_last_insert_rowid() 明確設定。

某些虛擬資料表實作可能會在提交交易時將資料列插入 rowid 資料表(例如,將累積在記憶體中的資料寫入磁碟)。在這種情況下,後續呼叫此函式會傳回與這些內部 INSERT 操作關聯的 rowid,這會導致不直觀的結果。以這種方式寫入 rowid 資料表的虛擬資料表實作可以透過在將控制權返回給使用者之前使用 sqlite3_set_last_insert_rowid() 還原原始 rowid 值來避免此問題。

如果在觸發程序中發生 INSERT 操作,則只要觸發程序正在執行,此常式就會傳回插入資料列的 rowid。一旦觸發程序結束,此常式傳回的值就會恢復為觸發程序觸發之前的狀態。

由於約束違規而失敗的 INSERT 不算成功的 INSERT,並且不會更改此常式傳回的值。因此,當插入失敗時,INSERT OR FAIL、INSERT OR IGNORE、INSERT OR ROLLBACK 和 INSERT OR ABORT 不會更改此常式傳回的值。當 INSERT OR REPLACE 遇到約束違規時,它不會失敗。在刪除導致約束問題的資料列後,INSERT 會繼續完成,因此 INSERT OR REPLACE 將始終更改此介面的傳回值。

就這個常式而言,即使 INSERT 後續被回滾,它也被視為成功。

SQL 陳述式可以透過 last_insert_rowid() SQL 函式 存取此函式。

如果在 sqlite3_last_insert_rowid() 函式執行時,另一個執行緒在同一個資料庫連線上執行新的 INSERT 操作,從而更改了最後插入的 rowid,則 sqlite3_last_insert_rowid() 傳回的值是不可預測的,可能不等於舊的或新的最後插入的 rowid

另請參閱 物件常數函式 列表。