Как добавить первичный ключ в таблицу MySQL?
Это то, что я пытался, но ничего не получается:
alter table goods add column `id` int(10) unsigned primary AUTO_INCREMENT;
у кого-нибудь есть совет?
8 ответов:
после добавления столбца, вы всегда можете добавить первичный ключ:
ALTER TABLE goods ADD PRIMARY KEY(id)
что касается того, почему ваш скрипт не работал, вам нужно указать
PRIMARY KEY
, а не просто словоPRIMARY
:alter table goods add column `id` int(10) unsigned primary KEY AUTO_INCREMENT;
если ваша таблица довольно большая лучше не использовать заявление:
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;
требуется 2 000 секунд, чтобы добавить PK в таблицу с ~200 млн строк.
Существующий Столбец
Если вы хотите добавить ограничение первичного ключа к существующему столбцу все перечисленные выше синтаксис не удастся.
чтобы добавить ограничение первичного ключа к существующему столбцу, используйте форму:
ALTER TABLE `goods` MODIFY COLUMN `id` INT(10) UNSIGNED PRIMARY KEY AUTO_INCREMENT;
этот код работает в моей БД MySQL:
ALTER TABLE `goods` ADD COLUMN `id` INT NOT NULL AUTO_INCREMENT, ADD PRIMARY KEY (`id`);
Не уверен, что это имеет значение для кого-либо еще, но я предпочитаю таблицу 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, -м