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?

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

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;

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

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!


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;


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;

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


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.


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

passo 1: show create table vendor_locations;

passo 2: ALTER TABLE vendor_locations drop foreign key vendor_locations_ibfk_1;

funcionou para mim.


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

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.