Как добавить автоинкрементный первичный ключ на основе порядка столбца? - PullRequest
7 голосов
/ 05 октября 2011

Мне нужно добавить идентификатор автоинкремента в уже существующую таблицу. Я сделал:

ALTER TABLE table_name ADD column_name INT NOT NULL AUTO_INCREMENT FIRST ,
ADD PRIMARY KEY (column_name)

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

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

Ответы [ 2 ]

8 голосов
/ 10 июля 2014

Обратите внимание, что таблица MySQL может иметь только один столбец с атрибутом AUTO_INCREMENT.

При условии, что таблица не имеет первичного ключа :

ALTER TABLE table_name ADD COLUMN new_id INT NOT NULL;
SET @x = 0;
UPDATE table_name SET new_id = (@x:=@x+1) ORDER BY whateveryouwant ASC;
ALTER TABLE table_name ADD PRIMARY KEY new_id (new_id);
ALTER TABLE table_name CHANGE new_id new_id INT NOT NULL AUTO_INCREMENT;

Предполагая, что таблица уже имеет первичный ключ без приращения :

Просто пропустите ключевое слово PRIMARY в четвертой команде.

3 голосов
/ 05 октября 2011
  1. Добавить новое поле - ALTER TABLE table_name ADD column_name INT FIRTS;
  2. Заполнить данные в новом поле.
  3. Сделать это поле частью первичного ключа и добавить параметр AUTO_INCREMENT -

    ALTER TABLE table_name ИЗМЕНИТЬ КОЛОННУ id id INT (11) NOT NULL AUTO_INCREMENT, ADD PRIMARY KEY (id);

РЕДАКТИРОВАТЬ:

Попробуйте этот план:

  1. Создайте другую таблицу, такую ​​же, как table_name.
  2. Заполните новую таблицу отсортированными данными из table_name таблицы:

    INSERT INTO temp_table_name SELECT * FROM table_name ORDER BY name;

  3. Пусто table_name table:

    TRUNCATE TABLE table_name;

  4. Измените table_name таблицу, добавьте новое поле автоинкремента и сделайте его основным (ваш код).

  5. Скопируйте данные из темп.таблица в table_name:

    INSERT INTO table_name SELECT NULL, т. * FROM temp_table_name t;

...