Как переназначить столбец 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
Или даже лучше, выберите все записи в альбоме и зациклируйте их.
Ответ 4
Используя определяемые пользователем переменные:
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;
Пример использования