Как переназначить столбец AUTO_INCREMENT для каждой строки в таблице MySQL, используя PHP - PullRequest
11 голосов
/ 16 июля 2011

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

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

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

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

Ответы [ 4 ]

17 голосов
/ 04 августа 2011

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

ALTER TABLE tablename DROP id

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

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

12 голосов
/ 16 июля 2011

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

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

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

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;

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

1 голос
/ 09 февраля 2014

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

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;

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

1 голос
/ 16 июля 2011

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

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

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

ALTER TABLE tableName AUTO_INCREMENT=10000

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

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

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

...