首页 > 解决方案 > 我可以假设最高的自动增量值总是最新的条目吗?

问题描述

我有以下代码从表中获取最新条目。

$con = mysqli_connect($host,$username,$password,$database);
$result = $con->query("SELECT MAX(ID) FROM Samples");
$newest = $result->fetch_assoc();

该字段ID是主键并具有 auto_increment。我没有代码来改变ID.

当我测试它时,代码总是成功地产生最新的条目,但我不知道这是否是我可以依赖的行为。这会一直有效吗?如果没有,是否有更可靠的方法来获取最新条目?

标签: mysqlsqlauto-increment

解决方案


SELECT MAX(ID) FROM ...一直工作吗?

不,它不会。如果您有多个程序副本连接到数据库,并且一个程序执行您的建议,然后另一个程序执行插入,则第一个程序的MAX(ID)值将变得陈旧。这是一个竞赛条件。这些是非常难以检测和调试的,因为它们直到系统处于重负载下才会出现。

如果你关心的只是一张快照,MAX(ID)你会没事的。但是您不能将此MAX(ID)值用作下一次插入的值,除非您永远不会有多个程序实例插入数据。依赖这种从不是不明智的。

如果没有,是否有更可靠的方法来获取最新条目?

执行 INSERT 操作后,您可以SELECT LAST_INSERT_ID()立即检索刚刚使用的自动递增 ID。当 INSERT 操作完成时,各种 API(如mysqliPDO和)将此 ID 返回给调用程序。JDBC

LAST_INSERT_ID()并且相关的 API 函数在一个连接一个连接的基础上工作。因此,如果多个连接正在插入行,则每个连接将获得自己的 id 值。


推荐阅读