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

时间:2011-07-16 16:20:21

标签: php mysql auto-increment

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

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

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

我想从头开始重新为MySQL表中的每一行分配ID。所以12346789变成12345678.我将如何实现这一目标?

4 个答案:

答案 0 :(得分:17)

我发现这个工作完美且非常快,所以这就是:

ALTER TABLE tablename DROP id

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

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

答案 1 :(得分:12)

如果您希望自动递增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;

您现在有连续的编号。

答案 2 :(得分:1)

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

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

由于你使用的是自动增量,你必须重置它

ALTER TABLE tableName AUTO_INCREMENT=10000

但请注意,我发布这个仅用于教育目的。这是错误的方法!单击next / prev时,不要在查询中提供确切的ID,而是

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

甚至更好,选择相册中的所有记录,然后循环播放。

答案 3 :(得分:1)

使用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;

使用示例