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