//返回最後一次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