O que significa mysql error 1025 (HY000): Erro ao renomear './foo' (errorno: 150)?


160

Eu tentei isso no mysql:

mysql> alter table region drop column country_id;

E entendi:

ERROR 1025 (HY000): Error on rename of './product/#sql-14ae_81' to
'./product/region' (errno: 150)

Alguma ideia? Coisas chave estrangeira?


@ skiphoppy - Você está tentando dar uma recompensa a uma resposta já dada? Isso é permitido? Ou o seu caso é diferente; nesse caso, você deve iniciar outro encadeamento?
Rick James

@RickJames Sim, é. No entanto, skiphoppy deve adicionar seu comentário sob a resposta que ele escolheu, pois a mensagem de recompensa desaparecerá quando a recompensa terminar.
randomSeed

Respostas:


240

Você geralmente recebe esse erro se suas tabelas usam 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 o nome do índice, algo como isto:

RESTRIÇÃO region_ibfk_1EXTERNA CHAVE ( country_id) Referências country( id) em excluir qualquer acção por ACTUALIZAÇÃO NO ACTION

Agora basta emitir um:

alterar região da tabela soltar chave estrangeira region_ibfk_1;

E finalmente um:

alterar coluna da tabela região soltar country_id;

E você está pronto para ir!


Observe que você também pode soltar a chave estrangeira e a coluna em uma consulta ALTER TABLE;
Valentin Grégoire

legais! devemos soltar chave estrangeira, tudo vai ficar bem! Obrigado!
Luan D

173

É realmente um erro de chave estrangeira, você pode descobrir usando o perror:

shell$ perror 150
MySQL error code 150: Foreign key constraint is incorrectly formed

Para descobrir mais detalhes sobre o que falhou, você pode usar SHOW ENGINE INNODB STATUSe procurar a seção ÚLTIMO ERRO DE CHAVE ESTRANGEIRA, que contém detalhes sobre o que está errado.

No seu caso, é provável que algo esteja fazendo referência à coluna country_id.


2
Novamente, outro MySQL enganoso exibiu erro ... Obrigado.
e2-e4

No phpMyAdmin, você pode encontrar o status do mecanismo em Storage Engines , InnoDB , Status do InnoDB
Maxence

15

Você também pode obter esse erro ao tentar soltar uma chave estrangeira inexistente. Portanto, ao descartar chaves estrangeiras, sempre verifique se elas realmente existem.

Se a chave estrangeira existir e você ainda estiver recebendo esse erro, tente o seguinte:

SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL';

// Largue a chave estrangeira aqui!

SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;

Isso sempre faz o truque para mim :)


1
Eu precisava disso ao mudar para um conjunto de caracteres diferente de uma tabela, devido a um erro do mysql: ERRO 1025 (HY000): erro ao renomear './table/#sql-14ae_81' para (errno: 150)
letsjump

7

Basta executar a consulta de alteração da tabela usando 'KEY' em vez de 'FOREIGN KEY' na instrução drop. Espero que ajude a resolver o problema e elimine a restrição de chave estrangeira e você possa alterar as colunas da tabela e soltar a tabela.

ALTER TABLE slide_image_sub DROP  KEY  FK_slide_image_sub;

aqui em DROP KEYvez de DROP FOREIGN KEY,

espero que ajude.

obrigado


4

Eu sei, este é um post antigo, mas é o primeiro hit no mecanismo de pesquisa favorito de todos, se você estiver procurando pelo erro 1025.

No entanto, existe um "hack" fácil para corrigir esse problema:

Antes de executar o (s) comando (s), primeiro desabilite a verificação de restrições de chave estrangeira usando este comando:

SET FOREIGN_KEY_CHECKS = 0;

Então você pode executar seus comandos.

Depois de concluir, não se esqueça de ativar a verificação de restrições de chave estrangeira novamente, usando este comando:

SET FOREIGN_KEY_CHECKS = 1;

Boa sorte com seu empenho.


Estava tendo problemas para instalar octobercms no xampp, finalmente isso ajudou.
jahackbeth

2

Eu tive problemas semelhantes uma vez. Excluí a chave primária da TABELA A, mas quando estava tentando excluir a coluna de chave estrangeira da tabela BI, foi mostrado o mesmo erro acima.

Você não pode descartar a chave estrangeira usando o nome da coluna e para ignorá-la no PHPMyAdmin ou no MySQL, remova primeiro a restrição de chave estrangeira antes de renomear ou excluir o atributo.


1

Dê uma olhada no arquivo de erro do seu banco de dados mysql. De acordo com o Bug # 26305, meu sql não fornece a causa. Este bug existe desde o MySQL 4.1 ;-)


Achei difícil seguir algumas de suas respostas, mas marcar 1 com um link para um relatório de bug. Aparentemente, agora foi corrigido no MySQL v5.6.6. :)
mwfearnley

1

Se você estiver usando um cliente como o MySQL Workbench, clique com o botão direito do mouse na tabela desejada de onde uma chave estrangeira deve ser excluída, selecione a guia Chave estrangeira e exclua os índices.

Então você pode executar a consulta assim:

alter table table_name drop foreign_key_col_name;

1

Provavelmente há outra tabela com uma chave estrangeira referenciando a chave primária que você está tentando alterar.

Para descobrir qual tabela causou o erro, você pode executar SHOW ENGINE INNODB STATUSe, em seguida, consulte a LATEST FOREIGN KEY ERRORseção

Use as categorias SHOW CREATE TABLE para mostrar o nome da restrição.

Provavelmente serão categories_ibfk_1

Use o nome para soltar a chave estrangeira primeiro e a coluna:

ALTER TABLE categories DROP FOREIGN KEY categories_ibfk_1;
ALTER TABLE categories DROP COLUMN assets_id;

1

Fazendo

SET FOREIGN_KEY_CHECKS=0;

antes que a operação também possa fazer o truque.


0

Eu acho que o problema de restrição de chave estrangeira. Country_id é usado como uma chave estrangeira em outra tabela?

Eu não sou um guru do DB, mas acho que resolvi um problema como esse (onde havia uma restrição de fk) removendo o fk, fazendo minhas alterações na tabela e refazendo-o.

Ficarei interessado em saber qual é o resultado - em algum momento o mysql é bastante enigmático.


O Mysql pode ser horrível. Bom geralmente, mas essas mensagens de erro, sheesh. Se conseguirmos uma explicação concisa de alguém no escritório, eu a jogarei aqui.
Trenton

0

No meu caso, eu estava usando o MySQL Workbench e enfrentei o mesmo problema ao soltar uma das minhas colunas em uma tabela. Não consegui encontrar o nome da chave estrangeira. Segui as seguintes etapas para resolver o problema:

  1. Rt. clique no seu esquema e selecione 'inspetor de esquema'. Isso fornece várias tabelas, colunas, índices, etc.

  2. Vá para a guia 'Índices' e procure o nome da coluna sob a coluna 'Coluna'. Uma vez encontrado, verifique o nome da tabela para este registro sob o nome da coluna 'Tabela'. Se corresponder ao nome da tabela desejada, anote o nome da chave estrangeira na coluna denominada 'Nome'.

  3. Agora execute a consulta: ALTER table tableNamexx DROP KEY ForeignKeyName;

  4. Agora você pode executar a instrução drop que deve ser executada com sucesso.


0

Eu recebi esse erro com o MySQL 5.6, mas não tinha nada a ver com chaves estrangeiras. Isso ocorreu em uma máquina com Windows 7 Professional, atuando como servidor em uma pequena LAN.

O aplicativo cliente estava executando uma operação em lote que cria uma tabela, preenchendo-a com alguns dados externos e, em seguida, executa uma consulta unindo-se a tabelas permanentes e eliminando a tabela "temporária". Esse lote faz isso aproximadamente 300 vezes e essa rotina específica está em execução semana após semana por vários anos, quando de repente obtemos o Erro 1025 Não é possível renomear o problema em um ponto aleatório do lote.

No meu caso, o aplicativo estava usando 4 instruções DDL, uma CREATE TABLE seguida de 3 CREATE INDEX, não há chave estrangeira. No entanto, apenas 2 dos índices são criados e o arquivo .frm da tabela real foi renomeado, no ponto de falha.

Minha solução foi livrar-se das instruções CREATE INDEX separadas e criá-las usando a instrução CREATE TABLE. Isso, no momento da redação deste artigo, resolveu o problema para mim e para minha ajuda alguém coçando a cabeça ao encontrar esse tópico.


-2

averageRatings = FOREACH groupedRatings GERAR grupo COMO movieID, AVG (ratings.rating) COMO avgRating, COUNT (ratings.rating) AS numRatings;

Se você estiver usando algum comando como o descrito acima, deverá usar o grupo em letras minúsculas. Isso pode resolver o seu problema, resolveu o meu. Pelo menos no script PIG.


Eu não acho que isso esteja relacionado ao problema, ele ou ela está atingindo o problema no mysql
Zdenek Machek
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.