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

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

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

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

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

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

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

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

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

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

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

 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; 

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

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

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

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

 ALTER TABLE tableName AUTO_INCREMENT=10000 

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

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

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

Использование пользовательских переменных :

 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; 

Пример использования