Rowid Tables
Rowid Tables
1.0 Definition
“rowid表”是SQLite架构中的任何表
- is
not
a virtual table, and
- is
not
a WITHOUT ROWID table.
典型的SQLite数据库模式中的大多数表都是rowid表。
Rowid表的特点在于,它们都有一个唯一的,非空的带符号的64位整数rowid,用作底层B树存储引擎中数据的访问键。
2.0 Quirks
- rowid表(如果有的话)的PRIMARY KEY通常不是表的真正主键,因为它不是底层B树存储引擎使用的唯一键。此规则的例外是rowid表声明了INTEGER PRIMARY KEY。在例外情况下,INTEGER PRIMARY KEY成为rowid的别名。
- rowid表的真正主键(用作在底层B树存储引擎中查找行的键)是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的表的rowid。因此,应用程序通常不应直接访问rowid,而应使用INTEGER PRIMARY KEY。
- 在底层文件格式中,每个rowid都存储为一个可变长度的整数。这意味着小的非负rowid值会占用比大或负rowid值更少的磁盘空间。
- 上述所有复杂情况(以及其他未在此提及的情况)都是由于需要保持向数百亿流通的SQLite数据库文件的后向兼容性。在完美的世界中,不会有像“rowid”这样的事物,并且所有表都将遵循作为WITHOUT ROWID表实现的标准语义,只是没有额外的“WITHOUT ROWID”关键字。不幸的是,生活很混乱。SQLite的设计者对当前的混乱表示诚挚的歉意。
SQLite is in the Public Domain.