1、背景知识
(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/
2、插入时注意事项
(1)当主键设置为自动增长的时候,主键的数据类型必须是integer类型,不能使long类型。
(2)插入的时候,如果罗列的列中没有自动增长列 ,自动增长列也是可以实现自动增长的,如一所示。
(3)插入的时候,如果罗列的列中有自动增长列,那么设置为null,可以实现自动增长,如二所示。
https://blog.csdn.net/scyatcs/article/details/12625521
3、读取刚插入的记录的ID
select last_insert_rowid() from 表名