【问题标题】:Get next MySQL row ID when any number of previous rows have been deleted删除任意数量的先前行时获取下一个 MySQL 行 ID
【发布时间】:2013-10-23 01:49:28
【问题描述】:

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

【问题讨论】:

  • 只是一个指针。如果你想要最大值,你可以做SELECT MAX(articleid) FROM article。您不必执行子查询
  • 不能在插入时获取 id (mysql_insert_id) 并使用它
  • 为什么在删除时不使用条件,包含:$last_article_id--?顺便说一句,你可以有$last_article_id = (int)$row['articleid']++,你应该确保$row->num_rows > 0
  • @dagon 不幸的是,我在我的脚本的不同部分生成文件名到 INSERT 语句。文件名是之前生成的。
  • @PHPglue 我将测试 $last_article_id 增量方法,谢谢。关于您的 ID 解决方案,我认为这行不通,因为用户可以按任何顺序删除任意数量的行......尽管我可能读错了您的解决方案

标签: php mysql sql mysqli row


【解决方案1】:

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

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

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

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

【讨论】:

  • *sigh*。没有一个赞成唯一理智的答案......堆栈溢出是最好的。
  • 该系统只能由一个人使用,但是,这是我没有考虑过的疏忽!对于这个和未来的项目,我将避免预测 AUTO_INCREMENT 值!非常感谢!
【解决方案2】:

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

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

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

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

【讨论】:

  • 我考虑在使用 INSERT 中的信息创建文件后重命名文件。 Thomas 在我的问题 cmets 中留下了一个潜在的好帖子,我将首先尝试,但您可能会在这里成为赢家
  • 为什么首先在进行查询之前创建文件名?有什么原因还是只是基于你写哪个部分的顺序?我也同意迈克尔的观点。查询内部架构数据可能不是在这里获得价值的最有效方式。
猜你喜欢
  • 2019-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多