删除任意数量的前行时获取下一个 MySQL 行 ID


Get next MySQL row ID when any number of previous rows have been deleted

我对我的数据库进行了以下调用,以从AUTO_INCREMENT列中检索最后一行 ID,我用它来查找下一行 ID:

$result = $mysqli->query("SELECT articleid FROM article WHERE articleid=(SELECT MAX(articleid) FROM article)");
$row = $result->fetch_assoc();
$last_article_id = $row["articleid"];
$last_article_id = $last_article_id + 1;
$result->close();

然后,我将$last_article_id用作文件名系统的一部分。

这工作得很好。直到我删除一行,这意味着调用会比我想要的顺序更靠后地检索 ID。

一个例子是:

ID
0 
1 
2
3
4-(deleted row)
5-(deleted row)
6-(next ID to be used for INSERT call)

我希望文件名是 6-0.jpg,但是文件名最终是 4-0.jpg因为它针对 ID 3 + 1 等......等。。。

关于删除任何

数量的前行后如何获取下一个 MySQL 行 ID 的任何想法?

您尝试预测下一个自动增量值时犯了一个重大错误。 如果您希望系统扩展,您别无选择...您必须先插入该行,或者稍后重命名文件。

这是我看到开发人员做出的经典疏忽 - 你正在编码它,就好像你的网站上只有一个用户一样。 极有可能在某个时候几乎同时创建两篇文章。 两个查询都将"预测"相同的 id,都将使用相同的文件名,其中一个文件将消失,其中一个表条目可能指向错误的文件,另一个条目将引用不存在的文件。 你会挠头问"这是怎么发生的?!

预测自动增量值是一种不好的做法。别这样。 规划并发性。

另外,information_schema表并不是真正的表...它们是向 SQL 接口公开的服务器内部。 调用"表"表并显示表状态是您不想在生产中进行的昂贵调用...所以不要试图使用你在那里找到的东西。

插入新行后可以使用 mysql_insert_id() 来检索新键:

$mysqli->query($yourQueryHere); 
$newId = $mysqli->insert_id();

不过,这需要id字段是主键(我相信)。

至于文件名,您可以将其存储在变量中,然后进行查询,然后更改名称,然后写入文件。