Как переназначить столбец AUTO_INCREMENT для каждой строки в таблице MySQL с помощью PHP

У меня есть галерея изображений, на которой пользователи веб-сайта могут загружать изображения. Когда изображение загружается, записывается строка MySQL, содержащая различные фрагменты информации об изображении, члене и т.д. Эта строка использует AUTO_INCREMENT для создания своего идентификатора, так что getimage.php?id=XX может отображать изображение, которое будет отображаться.

Я просматриваю идентификаторы с помощью цикла for, чтобы отображать изображения в галерее.

Если я удалю 5-ю строку/изображение, например, AUTO_INCREMENT переходит от 123456789 в 12346789.

Я хотел бы повторно назначить идентификатор каждой строке в таблице MySQL, начиная с нуля. Итак, 12346789 становится 12345678. Как мне это достичь?

Ответ 1

Я нашел, что это работает отлично и довольно быстро, так вот:

ALTER TABLE tablename DROP id

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

Я знаю, что это не правильный подход, однако для моей конкретной ситуации это именно то, что нужно. В таблице, которую я использовал, нет ничего, что относится либо к другой таблице, либо к другой.

Ответ 2

Если вы хотите, чтобы автоинкрементный идентификатор всегда был последовательным, пусть это идет, это бесполезная борьба.

Если вы просто хотите перенумеровать один раз, это легко:

Создайте новую таблицу с тем же макетом:

CREATE TABLE mytable2 LIKE oldtable;

Скопируйте все строки в новую таблицу, не забудьте не выбрать идентификатор auto_incrementing, иначе старая нумерация будет сохранена.

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

RENAME oldtable archive;

RENAME mytable2 oldtable;

DROP archive;

Теперь у вас есть последовательная нумерация.

Ответ 3

Как уже было сказано, это неправильный подход, но если вам нужно перенумеровать (оно действительно для столбца сортировки, например), вот запрос:

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

И поскольку вы используете автоинкремент, вы должны reset it

ALTER TABLE tableName AUTO_INCREMENT=10000

Но, пожалуйста, заметьте, я публикую это только для образовательных целей. Это неправильный подход! Вместо того, чтобы указывать точный идентификатор в запросе, когда вы нажимаете next/prev, do

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

Или даже лучше, выберите все записи в альбоме и зациклируйте их.