0

我对我的数据库进行了以下调用,以从 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 的任何想法?

4

2 回答 2

4

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

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

预测自动增量值是不好的做法。不要这样做。计划并发。

此外,information_schema 表并不是真正的表......它们是暴露给 SQL 接口的服务器内部。调用“tables”表和显示表状态是您不想在生产中进行的昂贵调用......所以不要试图使用您在那里找到的东西。

于 2013-10-23T03:56:26.437 回答
-1

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

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

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

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

于 2013-10-23T02:07:20.457 回答