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 上最近一次成功 INSERT 到 rowid 表或 虚拟表 的 rowid。不会记录对 WITHOUT ROWID 表的插入。如果数据库连接 D 上从未发生过对 rowid 表的成功 INSERT 操作,则 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 OR REPLACE 将始终更改此接口的返回值。
就本例程而言,即使 INSERT 随后被回滚,也认为它是成功的。
此函数可以通过 last_insert_rowid() SQL 函数 访问 SQL 语句。
如果另一个线程在 sqlite3_last_insert_rowid() 函数运行时对同一数据库连接执行新的 INSERT 操作,从而更改最后插入的 rowid,则 sqlite3_last_insert_rowid() 返回的值是不可预测的,并且可能不等于旧的或新的最后插入的 rowid。