如何使用 PHP 为 MySQL 表中的每一行重新分配 AUTO_INCREMENT 列

Posted

技术标签:

【中文标题】如何使用 PHP 为 MySQL 表中的每一行重新分配 AUTO_INCREMENT 列【英文标题】:How to re-assign AUTO_INCREMENT column for every row in a MySQL table using PHP 【发布时间】:2011-10-06 19:34:05 【问题描述】:

我有一个图片库,网站成员可以将图片上传到该图片库。上传图片时,会写入 mysql 行,包含图片、成员等各种信息。该行使用 AUTO_INCREMENT 创建其 ID,以便getimage.php?id=XX 可以获取要显示的图片。

我使用 for 循环遍历 ID 以在图库中显示图像。

如果我删除第 5 行/图像,例如,AUTO_INCREMENT 从123456789 变为12346789

我想从头开始为 MySQL 表中的每一行重新分配 ID。所以 12346789 变成了 12345678。我该如何实现呢?

【问题讨论】:

这是处理已删除图像的完全错误的方法。只需选择您需要的行并遍历这些行。 您为什么要这样做?这也意味着您必须更新指向这些图像的所有链接,以确保您仍然获得正确的图像。 据我所知,如果您仍然使用自动增量,您将无法做到这一点。 @Sam Dufel 例如,我可以只选择第 1 - 20 行并循环遍历它们吗?我该怎么做? 因为我没有另一个使用这些 auto_incremented id 的表,我发现这也很有帮助:'ALTER TABLE mytable DROP id; ALTER TABLE 上传 ADD id INT NOT NULL AUTO_INCREMENT FIRST, ADD PRIMARY KEY (id), AUTO_INCREMENT=1; ' 【参考方案1】:

我发现它可以完美且快速地工作,所以它是:

ALTER TABLE tablename DROP id

ALTER TABLE tablename ADD id INT NOT NULL AUTO_INCREMENT FIRST, ADD PRIMARY KEY (id), AUTO_INCREMENT=1

我知道这不是正确的方法,但是对于我的具体情况,这正是所需要的。我正在使用的表中没有任何内容可以从另一个表引用或引用到另一个表。

【讨论】:

真棒,简单明了的解决方案!介意解释它为什么以及如何工作? FIRST 是做什么的?哦,我建议将 INT 更改为 INT UNSIGNED... 完美的例子“有时如此简单的解决方案效果最好,令人难以置信”。谢谢@Drew:D @Domi FIRST 将列放在表格的第一个位置。【参考方案2】:

如果您希望自动递增的 ID始终是连续的,那就放手吧,这是徒劳的。

如果您只想重新编号一次,这很容易:

创建一个具有相同布局的新表:

CREATE TABLE mytable2 LIKE oldtable;

将所有行复制到新表中,切记不要选择auto_incrementing id,否则会保留旧编号。

INSERT INTO mytable2 (field2, field3, field4)
  SELECT field2, field3, field4 FROM oldtable ORDER BY oldtable.id;

RENAME oldtable archive;

RENAME mytable2 oldtable;

DROP archive;

您现在有连续编号。

【讨论】:

这是一个好方法。它比使用实时表的公认解决方案更安全,该解决方案可能会将其他活动添加到您的累积表中。然而,在任何一种情况下,如果有很多其他活动,将它们包装在不可中断的事务中是谨慎的。对于这个解决方案,重命名 oldtable archivedtable;会比 DROP 更好。一旦你确定一切正常,你就可以放弃它。【参考方案3】:

使用user-defined variables:

SET @id = 0;
UPDATE table SET id = @id := @id + 1 ORDER BY id;
SET @alt = CONCAT('ALTER TABLE table AUTO_INCREMENT = ', @id + 1);
PREPARE aifix FROM @alt;
EXECUTE aifix;
DEALLOCATE PREPARE aifix;

使用示例

http://www.paulwhippconsulting.com.au/webdevelopment/31-renumbering-an-qorderingq-field-in-mysql http://www.it-iss.com/mysql/mysql-renumber-field-values/

【讨论】:

【参考方案4】:

正如其他已经说过的,这是错误的方法,但如果您需要重新编号(例如,它对排序列有效),这里是查询:

UPDATE tabaleName SET fieldName = fieldName - 1 WHERE fieldName > 5 ORDER BY fieldName ASC

而且由于您使用的是自动增量,因此您必须重置它

ALTER TABLE tableName AUTO_INCREMENT=10000

但请注意,我仅出于教育目的发布此内容。这是错误的方法!当您单击下一个/上一个时,不要在查询中提供确切的 ID,而是执行

SELECT * FROM tableName WHERE fieldName > _the_previous_id_ 
ORDER BY fieldName ASC LIMIT 1

或者更好的是,选择专辑中的所有记录,然后循环它们。

【讨论】:

双重注明。我将如何循环表中的记录? 啊,好吧,这应该可以解决问题 SELECT * FROM tableName WHERE fieldName > the_previous_id ORDER BY fieldName ASC LIMIT 1 is the_previous_id 是一个常量还是我会用我的变量 $id 替换它吗?

以上是关于如何使用 PHP 为 MySQL 表中的每一行重新分配 AUTO_INCREMENT 列的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 CSS 为 jQuery 表中的每一行设置不同的图像

删除表中的每条记录时重新启动Id = 1? (角度 + Spring Boot + MySQL)

php - html:表中同一列的每一行中的不同数据

java mysql - 如何快速执行许多复杂的计算?

为啥 context.SaveChanges() 会更新表中的每一行?

在 Node.js 中为 postgres 表中的每一行以不同的间隔为每一行运行重复任务