我可以使用 ROWID 代替 SQLite 表中的时间戳吗?
我需要获取 SQLite 表的 50 个最新项目,我正在考虑使用单独的时间戳字段,但后来我发现更大的 ROWID 意味着更新的项目,并且 ROWID 已经存在,无需更改架构。
好吧,正如这里所说(我强调):
rowid 表的数据存储为 B-Tree 结构,其中每个表行包含一个条目,使用 rowid 值作为键。这意味着按 rowid 检索或排序记录很快。搜索具有特定 rowid 的记录或具有指定范围内的 rowid 的所有记录的速度大约是通过指定任何其他 PRIMARY KEY 或索引值进行的类似搜索的两倍。
但是,它也说:
可以使用 UPDATE 语句以与任何其他列值相同的方式修改 Rowid 值,可以使用内置别名(“rowid”、“oid”或“ rowid ”)之一,也可以使用由整数主键。
它肯定会更快,但它有点伤害我对“开放”设计的感觉,因为你依赖于实现的一个特性而不是使其具体化。
话虽如此,同一个链接也这样说:
除了下面提到的一个例外情况,如果 rowid 表的主键由单个列组成,并且该列的声明类型为“INTEGER”(大小写任意混合),则该列将成为 rowid 的别名。这样的列通常称为“整数主键”。如果声明的类型名称恰好是“INTEGER”,则 PRIMARY KEY 列仅成为整数主键。其他整数类型名称,如“INT”或“BIGINT”或“SHORT INTEGER”或“UNSIGNED INTEGER”会导致主键列表现为具有整数亲和性和唯一索引的普通表列,而不是 rowid 的别名。
我认为这给了你完美的答案:
在您的表上定义一个 INTEGER 主键并将其用于选择。您将获得使用 ROWID 的速度(因为正如上面所说,它只是一个别名),并且您将了解您正在做的事情的模式。