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

时间:2013-10-23 01:49:28

标签: php mysql sql mysqli row

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

2 个答案:

答案 0 :(得分:4)

通过尝试预测下一个自动增量值,您会发生重大错误。您没有选择,如果您希望系统扩展...您必须先插入行,或稍后重命名该文件。

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

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

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

答案 1 :(得分:-1)

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

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

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

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