在SQLite表中检索最后一条记录(再次)

时间:2012-08-01 19:35:50

标签: android sql sqlite

我先做了几次搜索,但仍有疑问。

我发现最好的答案是this所以答案。总结:

SELECT * FROM TABLE WHERE ID = (SELECT MAX(ID) FROM TABLE);

我想知道的是,以下方法是否也能正常工作(因为我懒得改变它,我碰巧喜欢它)。

SELECT * FROM TABLE ORDER BY ID DESC LIMIT 1

根据我们提供的SQLite Autoincrement文档,

  

如果在插入上未指定ROWID,或者指定的ROWID的值为NULL,则会自动创建适当的ROWID。 通常的算法是为新创建的行提供一个ROWID,该ROWID比插入之前的表中的最大ROWID大一个。如果表最初为空,则使用ROWID为1。 [强调补充]

进一步,

  

上述正常的ROWID选择算法将生成单调递增的唯一ROWID,只要您从不使用最大ROWID值,并且永远不会删除具有最大ROWID的表中的条目。 如果您删除了行或者您创建了一个具有最大可能ROWID的行,则在创建新行时可能会重复使用先前删除的行中的ROWID,而新创建的ROWID可能不会严格按升序排列。 [强调补充]

关于我提出的SQL语句的问题来自最后一句话。它似乎表明,如果删除任何行,无论是否使用了最大ROWID,都可以重用以前删除的ROWID。如果我们假设从不使用最大ROWID(手动或仅使用那么多记录),那么我们只需要担心删除记录。在这种情况下,第一个SQLite documnetation摘录使听起来好像你不会遇到任何问题。

有人确切知道吗?

我喜欢我的查询,因为它只涉及一个选择(albiet,以订单为代价)。我想,我可能过分关注微小的优化,不是吗?

修改: 实际上,重新审查上面引用的SQLite页面,我认为使用AUTOINCREMENT关键字可以保证单调增加ROWID。最后一节详细讨论了它。

  

如果列的类型为INTEGER PRIMARY KEY AUTOINCREMENT,则使用稍微不同的ROWID选择算法。为新行选择的ROWID至少比同一个表中以前存在的最大ROWID大一个。如果表之前从未包含任何数据,则使用ROWID为1。如果该表先前保留了具有最大可能ROWID的行,则不允许新的INSERT,并且任何插入新行的尝试都将失败,并出现SQLITE_FULL错误。

现在看来我很清楚。只是不能填写表格(最多9223372036854775807)。

很抱歉,我之前只是略过了这一部分!

4 个答案:

答案 0 :(得分:3)

您展示的两个查询是等效的。

关于他们是否返回最后一条记录,这取决于你的“最后”的含义。如果删除行,则不能依赖任一查询返回最后插入的行。

答案 1 :(得分:3)

我想在这里稍微说一下两个查询运行的速度 在一张有大约15,000行的桌子上,抓住其中的1400行,然后输入最后一行,这是我得到的结果:

SELECT macAddr, time, onPeakTotalIn, onPeakTotalOut, offPeakTotalIn, offPeakTotalOut FROM trafficMon WHERE macAddr="02:d2:ee:aa:aa:aa" ORDER BY time DESC LIMIT 1;

CPU时间:用户0.008124 sys 0.000000
虚拟机步骤:58741
Fullscan步骤:14156

SELECT macAddr, time, onPeakTotalIn, onPeakTotalOut, offPeakTotalIn, offPeakTotalOut FROM trafficMon WHERE id = (SELECT MAX(id) FROM trafficMon WHERE macAddr="02:d2:ee:aa:aa:aa");

CPU时间:用户0.000295 sys 0.000000
虚拟机步骤:49
Fullscan步骤:3

正如您所看到的,明智地执行MAX(id)资源要容易得多,并且花费的时间要少得多。

虽然0.008124s一直都是错误的,但是当您在基于MIPS的嵌入式设备(在我的情况下是路由器)上运行相同的命令时,在脚本中运行20-30x以及其他一些东西,这一切都是加起来。

希望有所帮助:)

Ducky

答案 2 :(得分:1)

首先,您应该检索最后一个插入的行ID,然后从该行ID获取您可以通过选择查询获取最后插入的记录。

RowID = sqlite3_last_insert_rowid(sqlite3Database)

SELECT * FROM tableName where RowID=RowID

此select语句将为您提供最后插入的记录

this link.

中了解更多详情

答案 3 :(得分:1)

如果表格中包含类型' autoincrement',则最好使用:

SELECT seq FROM sqlite_sequence WHERE name='TABLE_NAME'

查看示例(表格'客户'):

SELECT seq FROM sqlite_sequence WHERE name='customers'