行表
1.0 定义
“rowid 表”是 SQLite 模式中的任何表
典型 SQLite 数据库模式中的大多数表都是 rowid 表。Rowid 表的区别在于它们都有一个唯一的、非 NULL、带符号的 64 位整数rowid,用作底层B 树存储引擎中数据的访问键。
2.0 怪癖
rowid 表(如果有的话)的PRIMARY KEY通常不是表的真正主键,因为它不是底层B 树存储引擎使用的唯一键。此规则的例外是 rowid 表声明INTEGER PRIMARY KEY时。在例外情况下, INTEGER PRIMARY KEY 成为 rowid的别名。
rowid 表的 PRIMARY KEY 约束(只要它不是真正的主键或 INTEGER PRIMARY KEY)实际上与UNIQUE 约束相同。因为它不是真正的主键,所以 PRIMARY KEY 的列允许为 NULL,这违反了所有 SQL 标准。
可以通过读取或写入任何“rowid”或“oid”或“_rowid_”列来访问(或更改)rowid 表的rowid 。除非,如果表中有声明的列使用这些特殊名称,那么这些名称指的是声明的列,而不是底层的rowid。
通过rowid 访问记录是高度优化的并且速度非常快。
如果rowid不是INTEGER PRIMARY KEY的别名,则它不是持久的并且可能会更改。特别是VACUUM命令将更改未声明 INTEGER PRIMARY KEY 的表的 rowids。因此,应用程序通常不应直接访问 rowid,而是使用 INTEGER PRIMARY KEY。
在底层文件格式中,每个 rowid 都存储为一个 可变长度的整数。这意味着小的非负 rowid 值比大的或负的 rowid 值占用更少的磁盘空间。
上述所有复杂情况(以及此处未提及的其他问题)都源于需要为流通中的数千亿个 SQLite 数据库文件保持向后兼容性。在一个完美的世界中,不会有“rowid”这样的东西,所有表都将遵循作为 WITHOUT ROWID表实现的标准语义,只是没有额外的“WITHOUT ROWID”关键字。不幸的是,生活是混乱的。SQLite 的设计者对当前的混乱表示诚挚的歉意。