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?


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;

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;

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.


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


3

Use esta consulta,

alter table `table_name` add primary key(`column_name`);

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`);


0

Tente isto,

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

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);


-3

Remova aspas para funcionar corretamente ...

alter table goods add column id int(10) unsigned primary KEY AUTO_INCREMENT;
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.