Перенумерация существующей последовательности

Задача
Несмотря на мои рекомендации вы все-таки решили повторно упорядочить столбец последовательности.

Решение
Удалите столбец из таблицы. Затем вставьте снова. MySQL сделает последовательность номеров непрерывной.

Обсуждение
Если вы считаете, что повторного упорядочивания столбца AUTO_INCREMENT не избежать, удалите столбец из таблицы и заново вставьте его. Следующий пример показывает, как перенумеровать значения id таблицы insect:

mysql> ALTER TABLE insect DROP id;
mysql> ALTER TABLE insect
-> ADD id INT UNSIGNED NOT NULL AUTO_INCREMENT FIRST,
-> ADD PRIMARY KEY (id);

Первое предложение ALTER TABLE удаляет столбец id (в результате чего удаляется и PRIMARY KEY, так как столбца, на который он ссылается, больше нет).

Второе предложение восстанавливает столбец в таблице и делает его индексом PRIMARY KEY. (Ключевое слово FIRST помещает столбец на первое место в таблице, где он и располагался изначально. Обычно же ADD помещает столбцы в конец таблицы.) При добавлении в таблицу столбца AUTO_INCREMENT MySQL автоматически нумерует все строки последовательно, так что в итоге содержимое таблицы insect выглядит так:

mysql> SELECT * FROM insect ORDER BY id;

+----+-------------------+---------------+-------------+
| id | name | date | origin |
+----+-------------------+--------------+-------------+
| 1 | housefly | 2001-09-10 | kitchen |
| 2 | grasshopper | 2001-09-10 | front yard |
| 3 | stink bug | 2001-09-10 | front yard |
| 4 | cabbage butterfly | 2001-09-10 | garden |
| 5 | ant | 2001-09-10 | back yard |
| 6 | cricket | 2001-09-11 | basement |
| 7 | moth | 2001-09-14 | windowsill |
+----+-------------------+--------------+--------------+

Проблема повторного упорядочивания столбца при помощи двух предложений ALTER TABLE в том, что в промежутке между операциями таблица остается без столбца.


Это может создать трудности для других клиентов, пытающихся обратиться к таблице в течение данного промежутка времени. Чтобы не допустить подобной ситуации, выполним обе операции в одном предложении ALTER TABLE:

mysql> ALTER TABLE insect
-> DROP id,
-> ADD id INT UNSIGNED NOT NULL AUTO_INCREMENT FIRST,
-> AUTO_INCREMENT = 1;

MySQL разрешает выполнять в одном предложении ALTER TABLE несколько действий (что работает не во всех СУБД). Однако обратите внимание на то, что это многооперационное предложение представляет собой не просто объединение двух простых предложений ALTER TABLE, а имеет два отличия:

• Нет необходимости в восстановлении первичного ключа, так как MySQL не удаляет его до тех пор, пока, после выполнения всех действий, указанных в предложении ALTER TABLE, не удален индексированный столбец.

• Инструкция AUTO_INCREMENT указывает на то, что нумерация должна начаться со значения 1. На самом деле это необходимо только до версии 3.23.39 из-за возникавшей ошибки MySQL: счетчик последовательности не возвращался в начальное положение при удалении и добавлении столбца водном предложении ALTER TABLE. (Например, если у вас была таблица со значениями 8, 12 и 14, то без инструкции AUTO_INCREMENT новая последовательность была бы пронумерована как 15, 16, 17.).



Оцените статью: (0 голосов)
0 5 0

Статьи из раздела MySQL на эту тему:
Генераторы однострочных последовательностей
Генерирование значений последовательности
Добавление последовательности в существующую таблицу
Извлечение значений последовательности
Использование значений AUTO_INCREMENT для связывания таблиц