SQLite C 接口

最后插入行号

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 上的rowid表或虚拟表的 rowid 。插入WITHOUT ROWID表不被记录。如果在数据库连接 D 上没有成功插入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 或 REPLACE 将始终更改此接口的返回值。

就此例程而言,INSERT被认为是成功的,即使它随后被回滚。

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

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

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