我有以下代码从表中获取最新条目。
$con = mysqli_connect($host,$username,$password,$database);
$result = $con->query("SELECT MAX(ID) FROM Samples");
$newest = $result->fetch_assoc();
字段ID
是主键,并且具有auto_increment。我没有代码来改变ID
的价值。
当我测试代码时,代码总是成功地产生最新的条目,但我不知道这是否是我可以依赖的行为。这会一直有效吗?如果没有,是否有更可靠的方式来获得最新的条目?
答案 0 :(得分:4)
SELECT MAX(ID) FROM ...
会一直有效吗?
不,它不会。如果您的程序有多个副本连接到您的数据库,并且一个程序执行了您的建议,而另一个程序则执行插入,第一个程序是MAX(ID)
值将变得陈旧。这是竞争条件。这些很难检测和调试,因为它们不会在系统负载很重的情况下出现。
如果您关心的只是MAX(ID)
的快照,那么您就可以了。但您不能将此MAX(ID)
值用作下一次插入的值,除非 never 将有多个插入数据的程序实例。依靠那种 never。
如果没有,是否有更可靠的方式获得最新条目?
执行INSERT操作后,您可以立即执行SELECT LAST_INSERT_ID()
来检索刚刚使用的自动增量ID。当INSERT操作完成时,各种API(如mysqli
,PDO
和JDBC
会将此ID返回给调用程序。
LAST_INSERT_ID()
and the related API functions以逐个连接的方式工作。因此,如果多个连接正在插入行,则每个连接都将获得自己的id值。
答案 1 :(得分:-1)
MySQL具有自动增量功能,您可以使用
将列设置为自动增量ALTER TABLE document MODIFY COLUMN ID INT auto_increment
然后您可以向表中添加条目,而不必担心Id,使用max可能会有问题,尤其是当数据可以在您正在构建的系统之外进行修改时,例如直接输入到表中。要插入记录,请将Id保留为空。
我希望这会有所帮助,欢呼!