Переупорядочить / сбросить первичный ключ автоинкремента - PullRequest
117 голосов
/ 11 апреля 2009

У меня есть таблица MySQL с первичным ключом с автоматическим приращением. Я удалил несколько строк в середине таблицы. Теперь у меня есть, например, что-то вроде этого в столбце ID: 12, 13, 14, 19, 20. Я удалил 15, 16, 17 и 18 строк.

Я хочу переназначить / сбросить / переупорядочить первичный ключ, чтобы у меня была непрерывность, то есть сделать 19 a 15, 20 a 16 и т. Д.

Как я могу это сделать?

Ответы [ 14 ]

329 голосов
/ 25 марта 2011

Даже если этот вопрос кажется довольно старым, он опубликует ответ для кого-то, кто ищет здесь.

SET @count = 0;
UPDATE `users` SET `users`.`id` = @count:= @count + 1;

Если столбец используется в качестве внешнего ключа в других таблицах, убедитесь, что вы используете ON UPDATE CASCADE вместо значения по умолчанию ON UPDATE NO ACTION для отношения внешнего ключа в этих таблицах.

Далее, чтобы сбросить счетчик AUTO_INCREMENT, вы можете немедленно выполнить следующую инструкцию.

ALTER TABLE `users` AUTO_INCREMENT = 1;

Для MySQL это сбросит значение на MAX(id) + 1.

85 голосов
/ 11 апреля 2009

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

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

52 голосов
/ 26 июня 2010

Чтобы сбросить идентификаторы моей таблицы User, я использую следующий запрос SQL. Выше было сказано, что это разрушит любые ваши отношения с любыми другими таблицами.

ALTER TABLE `users` DROP `id`;
ALTER TABLE `users` AUTO_INCREMENT = 1;
ALTER TABLE `users` ADD `id` int UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST;
29 голосов
/ 12 октября 2009

Вы можете просто использовать этот запрос

alter table abc auto_increment = 1;
14 голосов
/ 12 сентября 2013
SET  @num := 0;

UPDATE your_table SET id = @num := (@num+1);

ALTER TABLE your_table AUTO_INCREMENT =1;

Я думаю, что это сделает

13 голосов
/ 04 мая 2013

Или из PhpMyAdmin удалите флаг «AutoIncrement», сохраните, установите его снова и сохраните. Это сбрасывает его.

1 голос
/ 12 июля 2018
SELECT * from `user` ORDER BY `user_id`; 

SET @count = 0;

UPDATE `user`  SET `user_id` = @count:= @count + 1;

ALTER TABLE `user_id` AUTO_INCREMENT = 1;

если хотите order by

1 голос
/ 27 мая 2017

в phpmyadmin

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

Перейти к вашей таблице-> щелкните меню операций-> Перейти к параметрам таблицы-> измените AUTO_INCREMENT на значение, с которого вы хотите начать.

Ваш автоинкремент начинается с этого номера.

попробуй. enter image description here

0 голосов
/ 29 марта 2019

Мое мнение - создать новый столбец с именем row_order. затем измените порядок столбцов. Я не принимаю изменения в первичном ключе. Например, если столбец заказа - banner_position, я сделал что-то вроде этого: это для удаления, обновления, создания столбца позиции баннера. Вызовите эту функцию или измените их порядок соответственно.

public function updatePositions(){
    $offers = Offer::select('banner_position')->orderBy('banner_position')->get();
    $offersCount = Offer::max('banner_position');
    $range = range(1, $offersCount);

    $existingBannerPositions = [];
    foreach($offers as $offer){
        $existingBannerPositions[] = $offer->banner_position;
    }
    sort($existingBannerPositions);
    foreach($existingBannerPositions as $key => $position){
        $numbersLessThanPosition = range(1,$position);
        $freshNumbersLessThanPosition = array_diff($numbersLessThanPosition, $existingBannerPositions);
        if(count($freshNumbersLessThanPosition)>0) {
            $existingBannerPositions[$key] = current($freshNumbersLessThanPosition);
            Offer::where('banner_position',$position)->update(array('banner_position'=> current($freshNumbersLessThanPosition)));
        }
    }
}
0 голосов
/ 09 января 2017

Лучший выбор - изменить столбец и удалить атрибут auto_increment. Затем выполните другой оператор alter и поместите auto_increment обратно в столбец. Это сбросит счетчик до максимального значения + 1 текущих строк и, таким образом, сохранит ссылки на внешние ключи обратно на эту таблицу, из других таблиц в вашей базе данных или любого другого использования ключа для этого столбца.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...