SQLite之rowid与sqlite3_last_insert_rowid()

本文详细介绍了SQLite数据库中的rowid字段特性,包括其自动递增、隐藏性及使用方式,以及如何通过SQL获取rowid值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SQLite数据库中的表均有一个特殊的rowid字段,它是一个不重复的64位有符号整数,默认起始值为1。rowid别名为oid或_rowid_,但在创建表的SQL声明语句中只能使用rowid作为关键字。如果在创建表的时候设置了类型为integer的具有自动增长性的主键,那么这时的主键相当于是rowid的别名。

rowid只能是单调递增的,它由SQLite内部维护,不能自己指定。对于失败的插入操作,rowid也可能在原来的基础上执行了自增。删除或回滚操作并不会减小rowid的值。当rowid达到所能表示的最大值时,这时如果有新纪录要插入,系统就会从之前没有被使用过的(或从已经被删除的记录的)rowid中随机取出一个作为rowid。若没有可用的rowid,系统就会抛出SQLITE_FULL的错误。

rowid字段在表中默认是隐藏的,也就是说,除非SQL查询语句中指定返回rowid,否则查询结果不会包含有rowid字段。

可以在创建表时使用WITHOUT ROWID以声明不生成rowid字段,例如:

CREATE TABLE IF NOT EXISTS wordcount(

 word TEXT PRIMARY KEY,

 cnt INTEGER

) WITHOUT ROWID;

将关键字AUTOINCREMENT使用在声明为WITHOUT ROWID的表不但不起作用,还将引发一个错误。

SQLiteAPI 函数sqlite3_last_insert_rowid()可以取得最后一条插入的记录的rowid。但sqlite3_last_insert_rowid()是基于当前进程的。也就是说,sqlite3_last_insert_rowid()取到的是当前进程最后一次插入记录的rowid。对于不是当前进程插入的记录,sqlite3_last_insert_rowi()均返回0。sqlite3_last_insert_rowi()对应的SQL声明为last_insert_rowid(),例如:

select last_insert_rowid() from exam_tbl

目前遇到问题:编译方法cmake .. -G "MinGW Makefiles" \ -DCMAKE_INSTALL_PREFIX=../projInstall \ -DENABLE_CURL=OFF \ -DBUILD_TESTING=OFF \ -DENABLE_TIFF=OFF \ -DBUILD_APPS=OFF \ -DBUILD_SHARED_LIBS=OFF \ -DENABLE_INTERNAL_SQLITE=ON编译后检查文件$ nm "D:/shareU-W/windows/lib/proj-9.6.1/projInstall/lib/libproj.a" | grep sqlite300000000000048b0 T proj_context_set_sqlite3_vfs_name U _ZN5osgeo4proj15SQLiteStatementC1EP12sqlite3_stmt U sqlite3_bind_blob U sqlite3_bind_int64 U sqlite3_bind_null U sqlite3_bind_text U sqlite3_close U sqlite3_column_blob U sqlite3_column_bytes U sqlite3_column_int64 U sqlite3_column_text U sqlite3_errmsg U sqlite3_exec U sqlite3_finalize U sqlite3_free_table U sqlite3_get_table U sqlite3_last_insert_rowid U sqlite3_open_v2 U sqlite3_prepare_v2 U sqlite3_reset U sqlite3_step U sqlite3_vsnprintfsqlite3_utils.cpp.obj:0000000000000000 p .pdata$_ZN5osgeo4proj17pj_sqlite3_memvfsD0Ev0000000000000000 p .pdata$_ZN5osgeo4proj17pj_sqlite3_memvfsD1Ev0000000000000000 r .rdata$_ZTIN5osgeo4proj14pj_sqlite3_vfsE0000000000000000 r .rdata$_ZTIN5osgeo4proj17pj_sqlite3_memvfsE0000000000000000 r .rdata$_ZTSN5osgeo4proj14pj_sqlite3_vfsE0000000000000000 r .rdata$_ZTSN5osgeo4proj17pj_sqlite3_memvfsE0000000000000000 r .rdata$_ZTVN5osgeo4proj14pj_sqlite3_vfsE0000000000000000 r .rdata$_ZTVN5osgeo4proj17pj_sqlite3_memvfsE0000000000000000 t .text$_ZN5osgeo4proj17pj_sqlite3_memvfsD0Ev0000000000000000 t .text$_ZN5osgeo4proj17pj_sqlite3_memvfsD1Ev0000000000000000 r .xdata$_ZN5osgeo4proj17pj_sqlite3_memvfsD0Ev0000000000000000 r .xdata$_ZN5osgeo4proj17pj_sqlite3_memvfsD1Ev0000000000000370 T _ZN5osgeo4proj10SQLite
最新发布
06-28
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值