Last Insert Rowid
上次插入Rowid
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)接口通常会将最近成功的INSERT的rowid返回到数据库连接D上的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或IGNORE,INSERT或ROLLBACK以及INSERT OR ABORT插入失败,则不会更改此例程的返回值。当INSERT OR REPLACE遇到约束冲突时,它不会失败。删除导致约束问题的行后,INSERT将继续完成,因此INSERT OR REPLACE将始终更改此接口的返回值。
就此例程而言,INSERT即使在后来被回滚时也被认为是成功的。
SQL函数可以通过last_insert_rowid()SQL函数访问此函数。
如果单独的线程在sqlite3_last_insert_rowid()函数运行时在同一数据库连接上执行新的INSERT,并因此更改了最后一个插入rowid,则sqlite3_last_insert_rowid()返回的值是不可预知的,并且可能不等于旧的或新的最后一个插入rowid。