“ rowid表”是SQLite架构中的任何表
典型的SQLite数据库模式中的大多数表是rowid表。Rowid表的特征在于它们都具有唯一的,非NULL的,带符号的64位整数rowid,该ID被用作基础B树存储引擎中数据的访问键。
rowid表 的PRIMARY KEY(如果有)通常不是该表的真正主键,从某种意义上说,它不是基础B树存储引擎使用的唯一键。该规则的例外是,当rowid表声明一个INTEGER PRIMARY KEY时。例外的是,INTEGER PRIMARY KEY成为rowid的别名 。
rowid表的PRIMARY KEY约束(只要它不是真正的主键或INTEGER PRIMARY KEY)与UNIQUE约束实际上是同一回事。因为它不是真正的主键,所以允许PRIMARY KEY的列为NULL,这违反了所有SQL标准。
所述ROWID一个rowid表可以通过读取或写入到任何“ROWID”或“OID”或“_ROWID_”列被访问(或改变)。除非表中有使用这些特殊名称的已声明列,否则这些名称引用已声明的列,而不引用基础rowid。
通过rowid对记录的访问已高度优化且非常快速。
如果rowid不是由INTEGER PRIMARY KEY别名的,则它不是永久的,并且可能会更改。特别是,VACUUM命令将更改未声明INTEGER PRIMARY KEY的表的行ID。因此,应用程序通常不应直接访问rowid,而应使用INTEGER PRIMARY KEY。
在基础文件格式中,每个rowid存储为一个 可变长度的整数。这意味着小的非负rowid值比大或负rowid值占用更少的磁盘空间。
上面所有的复杂性(以及此处未提及的其他复杂性)都是由于需要为循环中的数千亿个SQLite数据库文件保留向后兼容性而产生的。在一个理想的世界中,不会有“ rowid”之类的东西,并且所有表都将遵循实现为WITHOUT ROWID表的标准语义 ,只是没有额外的“ WITHOUT ROWID”关键字。不幸的是,生活很乱。SQLite的设计师对当前的混乱表示诚挚的歉意。