У меня есть галерея изображений, на которой пользователи веб-сайта могут загружать изображения. Когда изображение загружается, записывается строка 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;
Пример использования