Small. Fast. Reliable.
Choose any three.

SQLite C接口

最后插入行号

sqlite3_int64 sqlite3_last_insert_rowid(sqlite3 *);

大多数SQLite表(WITHOUT ROWID表除外)中的每个条目都有一个唯一的称为“ rowid”的64位带符号整数键。只要未显式声明的列也未使用行名,ROWID始终可作为未声明的列命名为ROWID,OID或_ROWID_。如果表中的列类型为INTEGER PRIMARY KEY,则该列是该行ID的另一个别名。

所述sqlite3_last_insert_rowid(d)接口通常返回ROWID最近成功的INSERT成一个rowid表或虚拟表 上的数据库连接D.插入到WITHOUT ROWID表不被记录。如果在数据库连接D上没有成功向rowid表插入INSERT,则sqlite3_last_insert_rowid(D)返回零。

除了在将行插入数据库表中时自动设置之外,此函数返回的值可以由sqlite3_set_last_insert_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或REPLACE遇到约束冲突时,它不会失败。删除导致约束问题的行后,INSERT继续完成,因此INSERT OR REPLACE将始终更改此接口的返回值。

就此例程而言,即使随后将其回滚,也认为INSERT成功。

SQL函数可通过last_insert_rowid()SQL函数访问此 函数

如果在 运行sqlite3_last_insert_rowid()函数时一个单独的线程在同一数据库连接上执行新的INSERT操作,从而更改了最后一个插入rowid,则sqlite3_last_insert_rowid()返回的值是不可预测的,并且可能不等于旧的或新的last插入rowid

另请参见 对象常量函数的列表