Como remover restrições da minha tabela MySQL?

252

Quero remover restrições da minha mesa. Minha consulta é:

ALTER TABLE `tbl_magazine_issue` 
DROP CONSTRAINT `FK_tbl_magazine_issue_mst_users`

Mas eu recebi um erro:

#1064- Você tem um erro na sua sintaxe SQL; verifique o manual que corresponde à versão do servidor MySQL para a sintaxe correta a ser usada perto de 'restrição FK_tbl_magazine_issue_mst_users' na linha 1

deepu sankar
fonte
1
É importante notar que, se você criou uma CHECKrestrição, não há necessidade de removê-la porque nenhuma restrição real é criada. Você pode selecionar information_schema.table_constraintspara verificar e pode executar add constraintrepetidas vezes sem nenhum erro. O MySQL não suporta CHECKrestrições, mas permite que o SQL pretenda criá-las (sem realmente criar as restrições).
ADTC 24/04
Possível duplicado de retirar a chave primária no MySQL
劉鎮瑲
Sua sintaxe é perfeitamente válida e agora é demo
Lukasz Szozda 20/01

Respostas:

423

O Mysql possui uma sintaxe especial para eliminar restrições de chave estrangeira:

ALTER TABLE tbl_magazine_issue
  DROP FOREIGN KEY FK_tbl_magazine_issue_mst_users
Boêmio
fonte
21
Postgres, MSSQL e Oracle todos têm alter table .. drop constraint. Parece que o MySQL é estranho.
Jared Beck
Ele diz que não pode descartar a "coluna2" porque é necessário em uma restrição de chave estrangeira. Quando faço o que você diz, recebo "Não é possível
derrubar a coluna2
Tudo bem, eu entendi, o estrangeiro é uma coisa separada, basta conectar a coluna a outras colunas da tabela. O meu tinha um nome padrão. Também agora eu agora que você pode deixar cair as chaves estrangeiras safetely sem a própria coluna que está sendo deixado cair
LEALO
1
A solução de Wellington Lorindo pode ser vista como mais correta, porque simplesmente remover a chave estrangeira não removerá o índice relacionado. Obviamente, o índice pode ter sido criado separadamente, mas se foi criado como conseqüência da adição da chave estrangeira, não será removido simplesmente ao largar a chave estrangeira.
Rich Harding
55

Eu tive o mesmo problema e consegui resolver com este código:

ALTER TABLE `table_name` DROP FOREIGN KEY `id_name_fk`;
ALTER TABLE `table_name` DROP INDEX  `id_name_fk`;
Wellington Lorindo
fonte
2
Isso pode ser visto como mais correto que a solução aceita, porque simplesmente remover a chave estrangeira não removerá o índice. Obviamente, o índice pode ter sido criado separadamente, mas se ele foi criado como conseqüência da adição da chave estrangeira, não será removido simplesmente ao largar a chave estrangeira.
Rich Harding
3
Como um único comando: ALTER TABLE table_name DROP FOREIGN KEY IF EXISTS id_name_fk, DROP INDEX IF EXISTS id_name_fk;
Frank Forte
26

Não existe DROP CONSTRAINTno MySQL. No seu caso, você pode usar DROP FOREIGN KEY.

Lothar
fonte
12

Se a restrição não for uma chave estrangeira, por exemplo. um adicionado usando 'UNIQUE CONSTRAINT (colA, colB)', então é um índice que pode ser eliminado usandoALTER TABLE ... DROP INDEX ...

Robert Knight
fonte
9

Também é bom, você pode desativar temporariamente todas as verificações de chave estrangeira de um banco de dados mysql: SET FOREIGN_KEY_CHECKS=0; E para habilitá-lo novamente: SET FOREIGN_KEY_CHECKS=1;

roelleor
fonte
8

Para adicionar um pouco à resposta de Robert Knight, já que o título da postagem em si não menciona chaves estrangeiras (e como a dele não possui exemplos de código completos e os blocos de código de comentários da SO não mostram tão bem quanto o código das respostas). blocos), adicionarei isso para restrições exclusivas . Qualquer um destes trabalhos para eliminar a restrição:

ALTER TABLE `table_name` DROP KEY `uc_name`;

ou

ALTER TABLE `table_name` DROP INDEX `uc_name`;
jbobbins
fonte
4

Alguns ORMs ou estruturas usam uma convenção de nomenclatura diferente para chaves estrangeiras que a padrão FK_[parent table]_[referenced table]_[referencing field], porque elas podem ser alteradas.

O Laravel, por exemplo, usa [parent table]_[referencing field]_foreigncomo convenção de nomenclatura. Você pode mostrar os nomes das chaves estrangeiras usando esta consulta, conforme mostrado aqui :

SELECT CONSTRAINT_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE 
WHERE REFERENCED_TABLE_SCHEMA = '<database>' AND REFERENCED_TABLE_NAME = '<table>';

Em seguida, remova a chave estrangeira executando a consulta DROP FOREIGN KEY mencionada anteriormente e seu nome próprio.

piscator
fonte
2

Para aqueles que vêm aqui usando o MariaDB:

Observe que o MariaDB permite instruções DROP CONSTRAINT em geral, por exemplo, para eliminar restrições de verificação:

ALTER TABLE table_name
DROP CONSTRAINT constraint_name;

https://mariadb.com/kb/en/library/alter-table/

Markus Barthlen
fonte
Sim, isso é para restrições que estão dentro da mesma tabela, por exemplo CONSTRAINT CHECK(a > b). Para restrições de chave estrangeira, parece que você ainda precisa da DROP FOREIGN KEYsintaxe, pelo menos na versão 10.2 do MariaDB
Frank Forte
1
  1. Ir para a visão de estrutura da tabela
  2. Você verá 2 opções no topo a.Estrutura da tabela b. Visão de relação .
  3. Agora clique na visualização Relação , aqui você pode eliminar sua restrição de chave estrangeira. Você terá toda a relação aqui.
Akshay Sharma
fonte
Isso é ótimo, trabalhou para mim quando você não sabe o id
Silviu St
0

Não existe DROP CONSTRAINTno MySql. Este trabalho como mágica no mysql 5.7

ALTER TABLE answer DROP KEY const_name;
Youness HARDI
fonte
0

A maneira mais simples de remover restrições é usar a sintaxe ALTER TABLE tbl_name DROP CONSTRAINT symbol;introduzida no MySQL 8.0.19 :

No MySQL 8.0.19, ALTER TABLE permite uma sintaxe mais geral (e padrão SQL) para descartar e alterar restrições existentes de qualquer tipo, em que o tipo de restrição é determinado a partir do nome da restrição.

ALTER TABLE tbl_magazine_issue DROP CONSTRAINT FK_tbl_magazine_issue_mst_users;

db <> demo de violino

Lukasz Szozda
fonte
-4

isso funcionará no MySQL para eliminar restrições

alter table tablename drop primary key;

alter table tablename drop foreign key;
Ranjitha
fonte
DROP PRIMARY KEYnão deve funcionar. DROP FOREIGN KEYfunciona, mas você precisa especificar para quem drop. Por exemploALTER TABLE tablename DROP FOREIGN KEY id_name_fk
RousseauAlexandre