Как добавить первичный ключ в таблицу MySQL?


104

Это то, что я пробовал, но это не удалось:

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

У кого-нибудь есть чаевые?


11
Когда что-то выходит из строя , всегда полезно указать, что означает сбой : вы получаете сообщение об ошибке? который из ?
Паскаль МАРТИН

Я предполагаю, что сообщение об ошибке выглядит так: определено несколько первичных ключей
LMD

Ответы:


227

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

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.
LMD

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
Если у вас, как у меня, это не работает, замените MODIFY на CHANGE, и он будет работать!
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;

Добавление PK в таблицу с ~ 200 млн строк занимает 2 000 секунд.


Я был удивлен, сколько времени мне нужно было искать, чтобы найти этот ответ. Спасибо за эти полезные примеры.
Райан,

4

Не уверен, что это важно для кого-то еще, но я предпочитаю таблицу идентификаторов первому столбцу в базе данных. Синтаксис для этого:

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,-фут



2

Этот код работает в моей базе данных mysql:

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столбец был красиво добавлен из первого элемента.

Результат запроса был:

ALTER TABLE table_nameADD idINT NOT NULL AUTO_INCREMENT FIRST, ADD PRIMARY KEY ( id);


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.