MySQL Removendo algumas chaves estrangeiras

190

Eu tenho uma tabela cuja chave primária é usada em várias outras tabelas e possui várias chaves estrangeiras para outras tabelas.

CREATE TABLE location (
   locationID INT NOT NULL AUTO_INCREMENT PRIMARY KEY
   ...
) ENGINE = InnoDB;

CREATE TABLE assignment (
   assignmentID INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
   locationID INT NOT NULL,
   FOREIGN KEY locationIDX (locationID) REFERENCES location (locationID)
   ...
) ENGINE = InnoDB;

CREATE TABLE assignmentStuff (
   ...
   assignmentID INT NOT NULL,
   FOREIGN KEY assignmentIDX (assignmentID) REFERENCES assignment (assignmentID)
) ENGINE = InnoDB;

O problema é que, quando estou tentando soltar uma das colunas de chave estrangeira (ou seja, locationIDX), isso gera um erro.

"ERRO 1025 (HY000): erro ao renomear"

Como posso soltar a coluna na tabela de atribuições acima sem obter esse erro?

Desenhou
fonte

Respostas:

447

Conforme explicado aqui , parece que a restrição de chave estrangeira deve ser eliminada pelo nome da restrição e não pelo nome do índice. A sintaxe é:

alter table footable drop foreign key fooconstraint
pugmarx
fonte
35
Este foi o meu problema. Eu me sinto meio idiota agora. Se alguém mais tiver esse problema, poderá encontrar os nomes das restrições de chave estrangeira usando a função SHOW CREATE TABLE.
8337 Drew
14
Dica: use SHOW CREATE TABLE footable;para ver qual é o nome da restrição. Não é o nome da coluna em si. Obrigado pela resposta!
Chris Baker
2
Você pode usar isso para encontrar restrições de chave estrangeira: * SELECT FROM information_schema.table_constraints ONDE constraint_schema = '<seu nome db>' E constraint_type = 'FOREIGN KEY'
Gayan Dasanayake
21

As chaves estrangeiras existem para garantir a integridade dos dados; portanto, você não pode soltar uma coluna desde que faça parte de uma chave estrangeira. Você precisa soltar a chave primeiro.

Eu acho que a seguinte consulta faria isso:

ALTER TABLE assignmentStuff DROP FOREIGN KEY assignmentIDX;
zombat
fonte
16

Como todos disseram acima, você pode excluir facilmente um FK. No entanto, acabei de notar que pode ser necessário descartar a própria chave em algum momento. Se você tiver alguma mensagem de erro para criar outro índice como o último, com o mesmo nome, seria útil descartar tudo relacionado a esse índice.

ALTER TABLE your_table_with_fk
  drop FOREIGN KEY name_of_your_fk_from_show_create_table_command_result,
  drop KEY the_same_name_as_above
Karla Danitza Duran Memijes
fonte
10

Verifique qual é o nome da CONSTRAINT e o nome da CHAVE ESTRANGEIRA:

SHOW CREATE TABLE table_name;

Remova o nome CONSTRAINT e o nome FOREIGN KEY:

ALTER TABLE table_name
  DROP FOREIGN KEY the_name_after_CONSTRAINT,
  DROP KEY the_name_after_FOREIGN_KEY;

Espero que isto ajude!

norodin
fonte
4

Aqui está uma maneira de eliminar a restrição de chave estrangeira, ela funcionará. ALTER TABLE location. location_id CHAVE ESTRANGEIRA location_ibfk_1;

Rei do rock Kirant
fonte
2

Ei, segui uma sequência acima e encontrei alguma solução.

SHOW CREATE TABLE footable;

Você receberá o FK Constrain Name como

ProjectsInfo_ibfk_1

Agora você precisa remover essas restrições. por alter table commantd

alter table ProjectsInfo drop foreign key ProjectsInfo_ibfk_1;

Em seguida, solte a coluna da tabela,

alter table ProjectsInfo drop column clientId;
Pratik Gaurav
fonte
1

Você geralmente recebe esse erro se suas tabelas usarem o mecanismo InnoDB. Nesse caso, você teria que soltar a chave estrangeira e, em seguida, alterar a tabela e soltar a coluna.

Mas a parte complicada é que você não pode soltar a chave estrangeira usando o nome da coluna, mas, em vez disso, teria que encontrar o nome usado para indexá-la. Para encontrar isso, emita o seguinte, selecione:

Mostrar região CREATE TABLE; Isso deve mostrar uma linha: no canto superior esquerdo, clique na opção +, clique no botão raio do texto completo e, em seguida, clique em ir. Onde você obterá o nome do índice, algo como isto:

CONSTRAINT region_ibfk_1 CHAVE ESTRANGEIRA (country_id) REFERÊNCIAS country (id) EM EXCLUIR NO ACTION ON ATUALIZAR NO ACTION Agora basta emitir um:

alterar tabela região soltar chave estrangeira region_ibfk_1;

ou

mais simplesmente digite: - alter table TableName solte a chave estrangeira TableName_ibfk_1 ;

lembre-se de que a única coisa é adicionar _ibfk_1 após o nome da tabela para fazer assim: - TableName _ibfk_1

Abinash Hota
fonte
0

Você não pode descartar a coluna de chave estrangeira porque está sendo referenciada na tabela assignmentStuff. Portanto, você deve primeiro eliminar a restrição de chave estrangeira assignmentStuff.assignmentIDX.

Uma pergunta semelhante já foi feita aqui . Verifique também aqui para mais informações.

Ronald Wildenberg
fonte
1
Portanto, como o assignmentStuff faz referência à chave primária da atribuição, não posso descartar a coluna locationID da atribuição? Isso parece meio intuitivo.
8337 Drew
Parece que mudei alguns nomes de colunas para que minha resposta realmente não faça sentido. Desculpe por isso ...
Ronald Wildenberg
0

Tente o seguinte:

alter table Documents drop
  FK__Documents__Custo__2A4B4B5E
Shailendra Mishra
fonte
0

passo 1: show create table vendor_locations;

passo 2: ALTER TABLE vendor_locations drop foreign key vendor_locations_ibfk_1;

funcionou para mim.

Jyothi M
fonte
0

primeiro é necessário obter o nome real da restrição por esta consulta

SHOW CREATE TABLE TABLE_NAME

Essa consulta resultará em restringir o nome da chave estrangeira, agora a consulta abaixo será eliminada.

ALTER TABLE TABLE_NAME DROP FOREIGN KEY COLUMN_NAME_ibfk_1

O último número no nome de restrição acima depende de quantas chaves estrangeiras você possui na tabela

Owais Akber
fonte