Como adicionar uma chave primária a uma tabela MySQL?

103

Tentei fazer isso, mas falhou:

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

Alguém tem uma dica?

mysql_go
fonte
11
Quando algo falha , é sempre uma boa ideia especificar o que significa falha : você recebe uma mensagem de erro? qual ?
Pascal MARTIN
Acho que a mensagem de erro se parece com: chave primária múltipla definida
LMD

Respostas:

226

Depois de adicionar a coluna, você sempre pode adicionar a chave primária:

ALTER TABLE goods ADD PRIMARY KEY(id)

Quanto ao motivo pelo qual seu script não estava funcionando, você precisa especificar PRIMARY KEY, não apenas a palavra PRIMARY:

alter table goods add column `id` int(10) unsigned primary KEY AUTO_INCREMENT;
O Scrum Meister
fonte
Para mim, diz: isso definiria várias chaves primárias. Estou usando InnoDB. Observe que já tenho 3 deles.
LMD
2
Eu definitivamente colocaria FIRSTdepois AUTO_INCREMENT, o que significa que a idserá a primeira coluna da tabela já existente. Caso contrário, será colocado no final da tabela como está escrito agora, o que pode ser um pouco confuso ao fazer algo simplesSELECT * ...
StefanK
Como obter o primeiro lugar para a nova coluna 'id'
TipVisor
17

Coluna Existente

Se você quiser adicionar uma restrição de chave primária a uma coluna existente, todas as sintaxes listadas anteriormente falharão.

Para adicionar uma restrição de chave primária a uma coluna existente, use o formulário:

ALTER TABLE `goods`
MODIFY COLUMN `id` INT(10) UNSIGNED PRIMARY KEY AUTO_INCREMENT;
MER
fonte
1
mysql não reconhece MODIFY como declaração apropriada (pelo menos no XAMPP, InnoDB)
LMD
@LMD Em qual versão do mysql você está? (NOTA: Eu sei que funcionou na época em que postei isso e acredito que foi 5,6 ... mas não me lembro ao certo)
MER
1
Se para você, como para mim, não funcionar substitua MODIFY por CHANGE e funcionará!
csr-nontol
12

Se sua mesa for muito grande, é melhor não usar a instrução:

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

porque ele faz uma cópia de todos os dados em uma tabela temporária, altera a tabela e a copia de volta. Melhor fazer manualmente. Renomeie sua mesa:

rename table goods to goods_old;

crie uma nova tabela com a chave primária e todos os índices necessários:

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

mova todos os dados da tabela antiga para a nova, desativando chaves e índices para acelerar a cópia:

- USE ISTO PARA TABELAS 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;

OU

- USE ISTO PARA TABELAS 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;

Leva 2.000 segundos para adicionar PK a uma tabela com aproximadamente 200 milhões de linhas.

Denis Makarskiy
fonte
Fiquei surpreso com o tempo que precisei pesquisar para encontrar essa resposta. Obrigado por esses exemplos úteis.
Ryan
4

Não tenho certeza se isso importa para mais alguém, mas prefiro a tabela de id à primeira coluna do banco de dados. A sintaxe para isso é:

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

O que é apenas uma ligeira melhora em relação à primeira resposta. Se você quiser que ele fique em uma posição diferente, então

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

HTH, -ft

ftrotter
fonte
3

Use esta consulta,

alter table `table_name` add primary key(`column_name`);
RATAN KUMAR
fonte
2

Este código funciona no meu banco de dados mysql:

ALTER TABLE `goods`
ADD COLUMN `id` INT NOT NULL AUTO_INCREMENT,
ADD PRIMARY KEY (`id`);
Michał Myszor
fonte
1
ALTER TABLE GOODS MODIFY ID INT(10) NOT NULL PRIMARY KEY;
Vimit Patel
fonte
0

Tente isto,

alter table goods add column `id` int(10) unsigned primary key auto_increment
phponwebsites
fonte
0

Para mim, nenhuma das sugestões funcionou, me dando os erros de sintaxe, então eu apenas tentei usar o phpmyadmin (versão 4.9.2), (10.4.10-MariaDB) e adicionei idcoluna com chave primária de auto-incremento. Idcoluna foi bem adicionada a partir do primeiro elemento.

O resultado da consulta foi:

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

av3000
fonte
-3

Remova aspas para funcionar corretamente ...

alter table goods add column id int(10) unsigned primary KEY AUTO_INCREMENT;
Raja Muthukutty
fonte