SQLite:如何获取最新记录?

时间:2019-01-20 10:20:25

标签: sqlite

我有一个SQLite数据库,想获取最后一条记录。

我知道ORDER BY column DESC LIMIT 1。但是,这还不够好,原因是该数据库A)没有索引,我也不想创建任何索引,也没有主键B)也很大,请考虑排序10亿行。

CREATE TABLE my_table (
    col1 TEXT,
    col2 float,
   )

现在,行在物理磁盘上的插入顺序与插入顺序相同,因此获取最后一行应该是微不足道的。我相信,MySQL中的此顺序将对应于MySQL中始终必须存在的主键,因此我可以使用ORDER BY primary_key DESC LIMIT 1解决方案。但是这里我不知道该怎么办,因为据我所知,没有对应于磁盘顺序的主键。

我做了一个SELECT COUNT(*) FROM my_table;(需要15分钟才能运行),所以我知道表中的确切行数,我们称它为N。如果我有AUTOINCREMENT PRIMARY KEY,我可以做{ {1}},但这似乎又消失了。

2 个答案:

答案 0 :(得分:1)

使用此代码:

select * from my_table order by rowid desc LIMIT 1

rowidsqlite表中的内置字段 阅读更多:https://www.sqlite.org/lang_createtable.html#rowid

答案 1 :(得分:0)

除非指定了WITHOUT ROWID,否则始终会有一个索引,即有一个称为 rowid 的隐藏列(只有在指定了INTEGER PRIMARY KEY时才可以编码的自动列)(INTEGER PRIMARY KEY定义了列作为 rowid 的别名)(AUTOINCREMENT施加了一个约束,即SQLite生成的值要大于任何现有值)。

您可以尝试按rowid使用ORDER,但如果没有AUTOINCREMENT,则不能保证最高的 rowid 将是最后一行(但是直到您击中9223372036854775807行之前,否则(假设您没有弄乱了rowid))。

使用AUTOINCREMENT会产生额外的开销,尤其是在插入时,因为它不仅必须检索最高的rowid(通常将其加上1),而且还必须从sqlite_sequence表中检索相应的行。 SQLite Autoincrement