首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Last Insert Rowid

代码语言:javascript
复制
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。

扫码关注腾讯云开发者

领取腾讯云代金券