Як додати первинний ключ до таблиці MySQL?


103

Це те, що я спробував, але це не вдається:

alter table goods add column `id` int(10) unsigned primary AUTO_INCREMENT;

Хтось має підказку?


11
Коли щось не вдається , завжди добре визначити, що означає збій : чи отримуєте ви повідомлення про помилку? який ?
Паскаль МАРТИН

Напевно, повідомлення про помилку виглядає так: визначено кілька основних ключів
LMD

Відповіді:


226

Після додавання стовпця ви завжди можете додати первинний ключ:

ALTER TABLE goods ADD PRIMARY KEY(id)

Щодо того, чому ваш сценарій не працював, вам потрібно вказати PRIMARY KEYне лише слово PRIMARY:

alter table goods add column `id` int(10) unsigned primary KEY AUTO_INCREMENT;

Для мене це говорить: це визначало б кілька первинних ключів. Я використовую InnoDB. Зауважте, у мене їх уже 3.
ЛМД

2
Я б точно поставив FIRSTпісля AUTO_INCREMENT, а це означає, що idбуде першим стовпцем вже існуючої таблиці. Інакше він буде поставлений в кінці таблиці, як написано зараз, що може бути трохи заплутано, коли робити простоSELECT * ...
StefanK

Як отримати перше місце в новій колонці "id"
TipVisor

17

Існуюча колона

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

Щоб додати обмеження первинного ключа до наявного стовпця, використовуйте форму:

ALTER TABLE `goods`
MODIFY COLUMN `id` INT(10) UNSIGNED PRIMARY KEY AUTO_INCREMENT;

1
mysql не визнає MODIFY належним твердженням (принаймні в XAMPP, InnoDB)
LMD

@LMD На якій версії mysql ви працюєте? (ПРИМІТКА. Я знаю, що це працювало під час публікації цього запису, і я вважаю, що це було 5,6 ... але я не можу точно згадати)
MER

1
Якщо для вас, як і для мене, це не працює, замініть МОДИФІЯЦІЮ НА ЗМІНУ, і воно спрацює!
csr-nontol

12

Якщо ваша таблиця досить велика, не використовуйте оператор:

alter table goods add column `id` int(10) unsigned primary KEY AUTO_INCREMENT;

оскільки він робить копію всіх даних у тимчасовій таблиці, змінює таблицю, а потім копіює її назад. Краще робити це вручну. Перейменуйте свою таблицю:

rename table goods to goods_old;

створити нову таблицю з первинним ключем та всіма необхідними індексами:

create table goods (
    id  int(10) unsigned not null AUTO_INCREMENT
    ... other columns ...
    primary key (id)
);

перемістити всі дані зі старої таблиці в нову, відключити ключі та індекси, щоб пришвидшити копіювання:

- ВИКОРИСТОВУЙТЕ ЦЕ ДЛЯ ТАБЛІВ MyISAM :

SET UNIQUE_CHECKS=0;
    ALTER TABLE goods DISABLE KEYS;
        INSERT INTO goods (... your column names ...) SELECT ... your column names FROM goods_old; 
    ALTER TABLE goods ENABLE KEYS;
SET UNIQUE_CHECKS=1;

АБО

- ВИКОРИСТОВУЙТЕ ЦЕ ДЛЯ ТАБЛИЦІВ InnoDB :

SET AUTOCOMMIT = 0; SET UNIQUE_CHECKS=0; SET FOREIGN_KEY_CHECKS=0;
    INSERT INTO goods (... your column names ...) SELECT ... your column names FROM goods_old; 
SET FOREIGN_KEY_CHECKS=1; SET UNIQUE_CHECKS=1; COMMIT; SET AUTOCOMMIT = 1;

Щоб додати ПК до столу з ~ 200 млн рядків, потрібно 2000 секунд.


Мене здивувало, скільки часу мені потрібно було шукати, щоб знайти цю відповідь. Дякуємо за ці корисні приклади.
Райан

4

Не впевнений, чи це стосується когось іншого, але я віддаю перевагу таблиці id перед першим стовпцем бази даних. Синтаксис для цього:

ALTER TABLE your_db.your_table ADD COLUMN `id` int(10) UNSIGNED PRIMARY KEY AUTO_INCREMENT FIRST;

Що лише незначне поліпшення в порівнянні з першою відповіддю. Якщо ви хотіли, щоб це було в іншому положенні, тоді

ALTER TABLE unique_address ADD COLUMN `id` int(10) UNSIGNED PRIMARY KEY AUTO_INCREMENT AFTER some_other_column;

HTH, -ft



2

Цей код працює в моєму mysql db:

ALTER TABLE `goods`
ADD COLUMN `id` INT NOT NULL AUTO_INCREMENT,
ADD PRIMARY KEY (`id`);



0

Для мене жодна пропозиція не спрацювала із синтаксисом помилок, тому я просто спробував використовувати phpmyadmin (версія 4.9.2), (10.4.10-MariaDB) та додав idстовпчик з первинним ключем автоматичного збільшення. Idстовпчик було добре додано з першого елемента.

Вихід запиту:

АЛЬТЕР ТАБЛИКА table_nameДОДАТИ idНЕ НУЛЬНИЙ АВТО_ІНКРЕМЕНТ ПЕРШИМ, ДОДАТИ ПЕРШИЙ КЛЮЧ ( id);


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.