SQLite之rowid與sqlite3_last_insert_rowid()

//返回最後一次insert的rowid,若是沒有插入就返回0 (DB session斷開後也返回0, 是保存在進程的內存中)
SELECT LAST_INSERT_ROWID();


//找到最大的rowid(若是是自定義的primaryKey, 好比 NumID  則均可以用,  反正是alias 別名)
SELECT  *,MAX(rowid) FROM Table_1004A;//推薦
SELECT  *,MAX(NumID  ) FROM Table_1004A;//推薦


SELECT  *,MIN(rowid) FROM Table_1004A;//推薦


//不推薦,再增長OrderBy DESC 等等
SELECT rowid FROM Table_1004A ORDER BY ROWID DESC LIMIT(1);
SELECT *,rowid FROM Table_1004A ORDER BY ROWID DESC LIMIT(1);


SELECT *,rowid "NAVICAT_ROWID" FROM "main"."Table_1004A" LIMIT 53000,1000


//時間: 0.03s
INSERT INTO "main"."Table_1004A"("ChipID", "ChipType", "BatchID", "T1_TestMode", "T1_Timestamp", "T1_Temp", "T1_ErrSaAddrNum", "T1_ErrSaAddr", "T1_ChipResult", "T1_HandlerResult", "T2_TestMode", "T2_Timestamp", "T2_Temp", "T2_ErrSaAddrNum", "T2_ErrSaAddr", "T2_ChipResult", "T2_RepairedSaAddr", "T2_HandlerResult", "Comment") VALUES (1301000100005001, 'XM1004_A_DWL', 100, 'ArrayWR', 1571106878, 120, 5, '1,2,3,4,5', 'Finish_MarchC', 1, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);


//結果顯示53102 + 顯示最後插入信息
SELECT LAST_INSERT_ROWID();
SELECT *,rowid FROM Table_1004A WHERE rowid= 53102;


//2句話,一句搞定
SELECT *,rowid FROM Table_1004A WHERE rowid=LAST_INSERT_ROWID();
一、背景知識

(1). ROWID

每一個表默認都有 rowid 列,除非建立表時指定了 WITHOUT ROWID, 它如今是 64 位長的。在查詢時用 select * from table1 裏沒有它,要顯式的用 select rowid, * from table1 就會列出它來。

(2). ROWID 的別名

ROWID 除了可用 rowid 查出它以外,還可用別名 _ROWID_ 和 OID,都不分大小寫的, 例如 select oid from table1。另外咱們還能夠自定義一個 ROWID 的別名,用 INTEGER PRIMARY KEY 標識的列也是 ROWID 的一個別名,好比咱們用 id 來做爲 ROWID 的別名。

ROWID 的表示也是個自增列,每一個表有本身的計數器,和常見的數據庫的自增列是一致的。

SQLite 的 ROWID 可不象 Oracle 的 ROWID, Oracle 的 ROWID 是純內部的,標記着記錄的物理位置,因此數據庫導入導出 Oracle 的 ROWID 就會變了。更爲可怕的是 SQLite 的 ROWID 是能夠本身賦值的。

(3). 自增列序列表(也是 ROWID)

用 INTEGER PRIMARY KEY AUTOINCREMENT 標識的列就是個自增列,說到底它也是 ROWID  別名。數據庫中存在自增列後,SQLite 就會建立一個 sqlite_sequence 表。全部表的自增列都共享這個表,sqlite_sequence 分別維護着每一個自增列的當前值,因此自增列的計數也是單獨的。它不象於 Oracle 中多個表在共用一個序列時,ID 值是交錯的,Oracle 的序列的好處就是插入前可獲知下一個序列值。


順便說一下 VACUUM命令,這個命令能重建 ROWID 值。

https://yanbin.blog/sqlite-primary-rowid-autoincrement/


二、插入時注意事項

(1)當主鍵設置爲自動增加的時候,主鍵的數據類型必須是integer類型,不能使long類型。

(2)插入的時候,若是羅列的列中沒有自動增加列 ,自動增加列也是能夠實現自動增加的,如一所示。

(3)插入的時候,若是羅列的列中有自動增加列,那麼設置爲null,能夠實現自動增加,如二所示。

https://blog.csdn.net/scyatcs/article/details/12625521


三、讀取剛插入的記錄的ID

select last_insert_rowid() from 表名
SQLite數據庫中的表均有一個特殊的rowid字段,它是一個不重複的64位有符號整數,默認起始值爲1。

rowid別名爲oid或_rowid_,但在建立表的SQL聲明語句中只能使用rowid做爲關鍵字。若是在建立表的時候設置了類型爲integer的具備自動增加性的主鍵,那麼這時的主鍵至關因而rowid的別名。
rowid只能是單調遞增的,它由SQLite內部維護,不能本身指定。對於失敗的插入操做,rowid也可能在原來的基礎上執行了自增。刪除或回滾操做並不會減少rowid的值。當rowid達到所能表示的最大值時,這時若是有新紀錄要插入,系統就會從以前沒有被使用過的(或從已經被刪除的記錄的)rowid中隨機取出一個做爲rowid。若沒有可用的rowid,系統就會拋出SQLITE_FULL的錯誤。

rowid字段在表中默認是隱藏的,也就是說,除非SQL查詢語句中指定返回rowid,不然查詢結果不會包含有rowid字段。
能夠在建立表時使用WITHOUT ROWID以聲明不生成rowid字段,例如:

CREATE TABLE IF NOT EXISTS wordcount(

 word TEXT PRIMARY KEY,

 cnt INTEGER

) WITHOUT ROWID;

將關鍵字AUTOINCREMENT使用在聲明爲WITHOUT ROWID的表不但不起做用,還將引起一個錯誤。
SQLiteAPI 函數sqlite3_last_insert_rowid()能夠取得最後一條插入的記錄的rowid。但sqlite3_last_insert_rowid()是基於當前進程的。也就是說,sqlite3_last_insert_rowid()取到的是當前進程最後一次插入記錄的rowid。對於不是當前進程插入的記錄,sqlite3_last_insert_rowi()均返回0。sqlite3_last_insert_rowi()對應的SQL聲明爲last_insert_rowid(),例如:

select last_insert_rowid() from exam_tbl

————————————————
版權聲明:本文爲CSDN博主「venchia_lu」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處連接及本聲明。
原文連接:https://blog.csdn.net/venchia_lu/article/details/50457274sql

相關文章
相關標籤/搜索