Remover chave primária no MySQL

182

Eu tenho o seguinte esquema de tabela que mapeia user_customers para permissões em um banco de dados MySQL ativo:

mysql> describe user_customer_permission;
+------------------+---------+------+-----+---------+----------------+
| Field            | Type    | Null | Key | Default | Extra          |
+------------------+---------+------+-----+---------+----------------+
| id               | int(11) | NO   | PRI | NULL    | auto_increment |
| user_customer_id | int(11) | NO   | PRI | NULL    |                |
| permission_id    | int(11) | NO   | PRI | NULL    |                |
+------------------+---------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

Gostaria de remover as chaves primárias de user_customer_id e permission_id e reter a chave primária para o ID.

Quando executo o comando:

alter table user_customer_permission drop primary key;

Estou tendo o erro a seguir:

ERROR 1075 (42000): Incorrect table definition; there can be only one auto column and it must be defined as a key

Como posso soltar a chave primária de uma coluna?

markb
fonte

Respostas:

286

Sem um índice, manter uma coluna de incremento automático se torna muito caro, é por isso que MySQLexige que uma coluna de incremento automático seja a parte mais à esquerda de um índice.

Você deve remover a propriedade incremento automático antes de soltar a chave:

ALTER TABLE user_customer_permission MODIFY id INT NOT NULL;
ALTER TABLE user_customer_permission DROP PRIMARY KEY;

Observe que você possui um composto PRIMARY KEYque cobre todas as três colunas e idnão é garantido que seja exclusivo.

Se for exclusivo, você poderá torná-lo uma PRIMARY KEYe AUTO_INCREMENToutra vez:

ALTER TABLE user_customer_permission MODIFY id INT NOT NULL PRIMARY KEY AUTO_INCREMENT;
Quassnoi
fonte
Não precisaria restaurar a coluna de ID como chave primária de incremento automático? alterar tabela user_customer_permission adicionar chave primária (id); alterar tabela user_customer_permission alterar id id (11) auto_increment;
markb
@markb: se você restaurar a chave primária, com certeza poderá revertê-la para AUTO_INCREMENT.
Quassnoi
o que significa que a coluna de incremento automático é a parte mais à esquerda da PRIMARY KEY. ?
Arup Rakshit 23/09
1
@ArupRakshit: dev.mysql.com/doc/refman/5.6/en/… Para usar o AUTO_INCREMENTmecanismo com uma tabela InnoDB, uma AUTO_INCREMENTcoluna ai_coldeve ser definida como parte de um índice para que seja possível executar o equivalente a uma SELECT MAX(ai_col)pesquisa indexada na tabela para obter o valor máximo da coluna. Normalmente, isso é alcançado tornando a coluna a primeira coluna de algum índice de tabela.
Quassnoi 23/09/2013
diz PRIMARY não está definido. Por que isso ocorre? Então eu tive que excluir e adicionar novamente a coluna de ID sem especificar chave primária
mrbengi
121

Uma linha:

ALTER TABLE  `user_customer_permission` DROP PRIMARY KEY , ADD PRIMARY KEY (  `id` )

Você também não perderá o incremento automático e precisará adicioná-lo novamente, o que pode ter efeitos colaterais.

mluebke
fonte
5
Eu acho que essa resposta precisa flutuar para o topo, além de remover a necessidade de alterar a definição de campo, também permite que a alteração com restrições fk na tabela seja alterada - realmente me ajudou!
tomfumb
Perfeito! Para mim, soltar a chave primária não funcionou, mesmo que eu altere o campo para se livrar do incremento automático. Mas esta solução funciona bem!
user2447161
14

Creio que Quassnoi respondeu à sua pergunta direta. Apenas uma observação: talvez seja apenas uma redação estranha da sua parte, mas você parece ter a impressão de ter três chaves primárias, uma em cada campo. Este não é o caso. Por definição, você pode ter apenas uma chave primária. O que você tem aqui é uma chave primária que é composta de três campos. Portanto, você não pode "soltar a chave primária em uma coluna". Você pode soltar a chave primária ou não a soltar. Se você desejar uma chave primária que inclua apenas uma coluna, poderá soltar a chave primária existente em 3 colunas e criar uma nova chave primária em 1 coluna.

Jay
fonte
11
ALTER TABLE `user_customer_permission` MODIFY `id` INT;
ALTER TABLE `user_customer_permission` DROP PRIMARY KEY;
Alix Axel
fonte
7

Caso você tenha uma chave primária composta, faça o seguinte: ALTER TABLE table_name DROP PRIMARY KEY,ADD PRIMARY KEY (col_name1, col_name2);

Visvendra Singh Rajpoot
fonte
5

"se você restaurar a chave primária, com certeza poderá revertê-la para AUTO_INCREMENT"

Não deve haver dúvida se é desejável "restaurar a propriedade PK" e "restaurar a propriedade de incremento automático" da coluna ID.

Dado que foi um incremento automático na definição anterior da tabela, é bem provável que exista algum programa que seja inserido nessa tabela sem fornecer um valor de ID (porque a coluna ID é de incremento automático).

Qualquer operação desse programa será interrompida por não restaurar a propriedade de incremento automático.

Erwin Smout
fonte
3

Primeiro modifique a coluna para remover o campo auto_increment como este: alter table user_customer_permission modify id da coluna int;

Em seguida, solte a chave primária. alterar tabela user_customer_permission soltar chave primária;

John Gunderman
fonte
2
ALTER TABLE `table_name` ADD PRIMARY KEY( `column_name`);
Malith Ileperuma
fonte
1

Eu tive o mesmo problema e ao lado de alguns valores dentro da minha tabela. Embora eu tenha alterado minha Chave Primária com

ALTER TABLEDROP PRIMARY KEY , ADD PRIMARY KEY (ID user_customer_permission)

problema continuou no meu servidor. Criei um novo campo dentro da tabela, transferi os valores para um novo campo e apaguei o antigo, problema resolvido !!

Sam
fonte
1

Para adicionar chave primária na coluna.

ALTER TABLE table_name ADD PRIMARY KEY (column_name);

Para remover a chave primária da tabela.

ALTER TABLE table_name DROP PRIMARY KEY;
sumit katiyar
fonte
0

Primeiro faça backup do banco de dados. Solte qualquer chave estrangeira associada à tabela. truncar a tabela de chaves estrangeiras.Truncar a tabela atual. Remova as chaves primárias necessárias. Use sqlyog ou workbench ou heidisql ou dbeaver ou phpmyadmin.

Noby Nirmal
fonte
0

Localize a tabela no gerenciador SQL, clique com o botão direito do mouse e selecione design, clique com o botão direito do mouse no pequeno ícone de chave e selecione remover chave primária.

Noob Helper
fonte
Embora esta postagem possa resolver a questão, incluir uma captura de tela realmente ajuda a melhorar a qualidade da sua postagem. Lembre-se de que você está respondendo à pergunta dos leitores no futuro e essas pessoas podem não conhecer a mesma interface do usuário que está visualizando.
Pirate X