千家信息网

无ROWID优化(The WITHOUT ROWID Opt

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,摘自:https://www.sqlite.org/withoutrowid.html#wtu1.0介绍默认情况下,SQLite数据库中的每一行都会有一个叫做rowid的特殊列,该列唯一标识数据库表中
千家信息网最后更新 2026年11月02日无ROWID优化(The WITHOUT ROWID Opt

摘自:https://www.sqlite.org/withoutrowid.html#wtu


1.0介绍
默认情况下,SQLite数据库中的每一行都会有一个叫做rowid的特殊列,该列唯一标识数据库表中的某一行。然而如果在CREATE TABLE语句的后面添加WITHOUT ROWID关键字,就会禁用rowid这一列。有时候省略掉rowid,能够带来空间和性能上的提升。
1.1 语法
现在创建一个WITHOUT ROWID的表,最直接的方式就是在CREATE TABLE 语句之后添加关键字WITHOUT ROWID.例如:
CREATE TABLE IF NOT EXISTS wordcount(
word TEXT PRIMARY KEY,
cnt INTEGER
) WITHOUT ROWID;
如其他所有的SQL语法一样,关键字的大小写不敏感。如下的任何一种方式都可以接受:
WITHOUT rowid , withoutrowid , WIThOut rOwId .她们代表一个意思。

注意:如果表指定了WITHOUT ROWID属性,表必须指定PRIMARY KEY。否则创建表的时候,会返回错误,错误的大体意思是指定WITHOUT ROWID的创建表语句缺少PRIMARY KEY。

大多数情况下,rowid和oid或者_rowid_代表一个意思。然而只有rowid才可以出现在创建表的语句当中。

1.2兼容性
只有SQLite 3.8.2版本之后的程序才可以使用WITHOUT ROWID关键字。早期版本的SQLite打开携带WITHOUT ROWID属性的表,将会返回一个malformed database schema 的错误。

1.3 Quirks(特殊性)
迄今为止,WITHOUT ROWID 只能够被SQLite数据库使用,其他的数据库引擎并没有兼容该关键字。在正统的系统中,即使没有WITHOUT ROWID关键字,所有的表也应该表现的和WITHOUT ROWID的效果一样。然而,SQLite在一开始被设计的时候,就采用整型的ROWID来简化实现的方式。这种方法表现很好很多年了。但是随着SQLite的需求的增长,(the need for tables in which the PRIMARY KEY really did correspondto the underlying row key grew more acute)对于表指定PRIMARY KEY属性变得更加迫切,因此和rowkey的矛盾更加尖锐。为了兼容过去的已经被使用了很久很久的程序,因此without rowid的概念终于被添加到SQLite中,(The WITHOUT ROWID concept was added in order to meet that needwithout breaking backwards compatibility with the billions of SQLite databasesalready in use at the time (circa 2013).)
为了无缝的兼容过去成千上万的程序,WITHOUT ROWID的概念被添加到SQLite中。
2.0 与携带Rowid表不同之处
WITHOUT ROWID是一个优化选项。她没有提供任何新的特性(capablilities).操作携带ROWID表和操作不携带ROWID的表,使用的都是相同的语法。唯一的优点是节省磁盘空间,并且比普通的表快一些。

多数情况下,携带rowid表和不携带rowid表是可以互换的(interchangeable).但是WITHOUT ROWID表存在一些限制,而这些限制是普通的rowid表不具备的。

1.指定了WITHOUT ROWID的表必须指定PRIMARYKEY, 否则建表失败
2指定了WITHOUT ROWID的表不能够指定INTEGERPRIMARY KEY。In an ordinary table, "INTEGER PRIMARY KEY" means that thecolumn is an alias for the rowid. But since there is no rowid in a WITHOUTROWID table, that special meaning no longer applies. An "INTEGER PRIMARYKEY" column in a WITHOUT ROWID table works like an "INT PRIMARYKEY" column in an ordinary table: It is a PRIMARY KEY that has integeraffinity.
3 指定了WITHOUT ROWID的表不能使用AUTOINCREMENT关键字

关键 关键字 数据 数据库 语句 属性 情况 意思 方式 程序 语法 错误 普通 特殊 一行 代表 只有 时候 概念 版本 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 花魁咖啡 互联网科技海报 广州淘业互联网络科技 科技金融是不是互联网金融 壕鑫互联网络科技 撒么互联网科技公司 互联网前沿科技 哈尔滨新华互联网科技 互联网巨头投资的硬核科技 太原新华互联网科技学校怎么样 富国互联网科技创新基金 玖二柒互联网科技公司待遇 贵州叶脉互联网科技有限公司所属行业 宁夏众和广鑫互联网科技有限公司 辽宁互联网新科技 爱医互联网络科技 互联网方面的科技前沿 皮皮虾互联网科技有限公司 云南互联网科技学费 长沙易易互联网科技有限公司 新华互联网科技学校 A股互联网金融科技公司 互联网扶贫科技 苏州互联网科技贷款公司 海南购全球互联网科技 老年人脱离互联网科技的作文 银川新华互联网科技职业技术培训学校图片 河南住房之家互联网科技 锡山区互联网智能科技产品供应 黑科技 体验场景 互联网大会
0