Cosa significa errore mysql 1025 (HY000): errore nella ridenominazione di './foo' (errorno: 150)?


160

Ho provato questo in mysql:

mysql> alter table region drop column country_id;

E ottenuto questo:

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

Qualche idea? Roba chiave esterna?


@skiphoppy - Stai cercando di dare una taglia a una risposta già data? È anche permesso? O il tuo caso è diverso, nel qual caso dovresti iniziare un altro thread?
Rick James,

@RickJames Sì, lo è. Tuttavia, skiphoppy dovrebbe aggiungere il suo commento sotto la risposta che ha eletto, poiché il messaggio bouty scompare al termine della generosità.
RandomSeed,

Risposte:


240

In genere si verifica questo errore se le tabelle utilizzano il motore InnoDB. In tal caso dovresti rilasciare la chiave esterna, quindi eseguire la tabella di modifica e rilasciare la colonna.

Ma la parte difficile è che non puoi rilasciare la chiave esterna usando il nome della colonna, ma invece dovresti trovare il nome usato per indicizzarla. Per trovarlo, emetti la seguente selezione:

MOSTRA CREA TABELLA regione;

Questo dovrebbe mostrarti il ​​nome dell'indice, qualcosa del genere:

RITENUTA region_ibfk_1CHIAVE ESTERA ( country_id) RIFERIMENTI country( id) SU ELIMINA NO AZIONE SU AGGIORNAMENTO NO AZIONE

Ora emetti semplicemente un:

modifica la regione della tabella trascina chiave esterna region_ibfk_1;

E infine un:

modifica la regione della tabella drop column country_id;

E sei a posto!


Si noti che è anche possibile rilasciare la chiave esterna e la colonna in una query ALTER TABLE;
Valentin Grégoire,

simpatico! dovremmo rilasciare la chiave esterna, tutto andrà bene! Grazie!
Luan D,

173

È davvero un errore di chiave esterna, puoi scoprirlo usando perror:

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

Per scoprire maggiori dettagli su ciò che è fallito, è possibile utilizzare SHOW ENGINE INNODB STATUSe cercare la sezione ULTIMO ERRORE CHIAVE ESTERO che contiene dettagli su ciò che è sbagliato.

Nel tuo caso, è molto probabile che qualcosa stia facendo riferimento alla colonna country_id.


2
Ancora una volta, un altro errore fuorviante di MySQL ha mostrato ...
e2-e4,

In phpMyAdmin, puoi trovare lo stato del motore in Motori di archiviazione , InnoDB , Stato InnoDB
Maxence

15

È inoltre possibile ottenere questo errore nel tentativo di eliminare una chiave esterna inesistente. Pertanto, quando si rilasciano le chiavi esterne, assicurarsi sempre che esistano effettivamente.

Se la chiave esterna esiste e si verifica ancora questo errore, provare quanto segue:

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';

// Rilascia qui la chiave esterna!

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

Questo fa sempre il trucco per me :)


1
Ne avevo bisogno mentre passavo a un set di caratteri diverso di una tabella, a causa di un errore mysql: ERRORE 1025 (HY000): errore durante la ridenominazione di './table/#sql-14ae_81' in (errno: 150)
letsjump

7

Basta eseguire la query della tabella di modifica usando 'KEY' invece di 'FOREIGN KEY' nell'istruzione drop. Spero che possa aiutare a risolvere il problema, eliminando il vincolo di chiave esterna e puoi modificare le colonne della tabella e rilasciare la tabella.

ALTER TABLE slide_image_sub DROP  KEY  FK_slide_image_sub;

qui DROP KEYinvece di DROP FOREIGN KEY,

spero che possa aiutare.

Grazie


4

Lo so, questo è un vecchio post, ma è il primo successo sul motore di ricerca preferito di tutti se stai cercando l'errore 1025.

Tuttavia, esiste un semplice "hack" per risolvere questo problema:

Prima di eseguire i tuoi comandi devi prima disabilitare il controllo dei vincoli di chiave esterna usando questo comando:

SET FOREIGN_KEY_CHECKS = 0;

Quindi sei in grado di eseguire i tuoi comandi.

Al termine, non dimenticare di abilitare nuovamente il controllo dei vincoli di chiave esterna, usando questo comando:

SET FOREIGN_KEY_CHECKS = 1;

Buona fortuna per il tuo impegno.


Ho avuto problemi con l'installazione di octobercms su xampp, finalmente questo ha aiutato.
Jahackbeth,

2

Ho avuto problemi simili una volta. Ho eliminato la chiave primaria dalla TABELLA A ma quando stavo cercando di eliminare la colonna della chiave esterna dalla tabella BI è stato mostrato lo stesso errore sopra riportato.

Non è possibile rilasciare la chiave esterna utilizzando il nome della colonna e per bypassarla in PHPMyAdmin o con MySQL, rimuovere innanzitutto il vincolo della chiave esterna prima di rinominare o eliminare l'attributo.


1

Dai un'occhiata al file di errore per il tuo database mysql. Secondo Bug # 26305 il mio sql non ti dà la causa. Questo errore esiste da MySQL 4.1 ;-)


Ho trovato alcune delle tue risposte difficili da seguire, ma +1 per il collegamento a una segnalazione di bug. Apparentemente, ora è stato risolto in MySQL v5.6.6. :)
mwfearnley,

1

Se si utilizza un client come MySQL Workbench, fare clic con il pulsante destro del mouse sulla tabella desiderata da cui eliminare una chiave esterna, quindi selezionare la scheda Chiave esterna ed eliminare gli indici.

Quindi puoi eseguire la query in questo modo:

alter table table_name drop foreign_key_col_name;

1

Probabilmente esiste un'altra tabella con una chiave esterna che fa riferimento alla chiave primaria che si sta tentando di modificare.

Per scoprire quale tabella ha causato l'errore è possibile eseguire SHOW ENGINE INNODB STATUSe quindi consultare la LATEST FOREIGN KEY ERRORsezione

Utilizzare le categorie SHOW CREATE TABLE per mostrare il nome del vincolo.

Molto probabilmente sarà categorie_ibfk_1

Utilizzare il nome per eliminare prima la chiave esterna e poi la colonna:

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

1

fare

SET FOREIGN_KEY_CHECKS=0;

prima che l'Operazione possa fare anche il trucco.


0

Immagino che il problema di vincolo di chiave esterna. Country_id è usato come chiave esterna in un'altra tabella?

Non sono un guru del DB, ma penso di aver risolto un problema come questo (dove c'era un vincolo di fk) rimuovendo l'fk, facendo le mie cose da alter table e poi rifando le cose di fk.

Sarò interessato a sapere qual è il risultato - a volte mysql è piuttosto enigmatico.


Mysql può essere terribile. Buono di solito, ma quei messaggi di errore, sheesh. Se riceviamo una spiegazione concisa da qualcuno in ufficio, la vomiterò qui.
Trenton,

0

Nel mio caso, stavo usando MySQL workbench e ho riscontrato lo stesso problema mentre lasciavo cadere una delle mie colonne in una tabella. Non sono riuscito a trovare il nome della chiave esterna. Ho seguito i seguenti passaggi per risolvere il problema:

  1. Rt. fai clic sullo schema e seleziona "Impostazioni schema". Questo ti dà varie tabelle, colonne, indici, ect.

  2. Vai alla scheda denominata "Indici" e cerca il nome della colonna sotto la colonna denominata "Colonna". Una volta trovato, controlla il nome della tabella per questo record nella colonna "Tabella". Se corrisponde al nome della tabella desiderata, annotare il nome della chiave esterna dalla colonna denominata "Nome".

  3. Ora esegui la query: tabella ALTER tableNamexx DROP KEY foreignKeyName;

  4. Ora puoi eseguire l'istruzione drop che deve essere eseguita correttamente.


0

Ho avuto questo errore con MySQL 5.6 ma non aveva nulla a che fare con le chiavi esterne. Questo si trovava su una macchina Windows 7 Professional che fungeva da server su una piccola LAN.

L'applicazione client stava eseguendo un'operazione batch che crea una tabella riempie con alcuni dati esterni, quindi esegue una query unendo le tabelle permanenti e rilasciando la tabella "temporanea". Questo batch lo fa circa 300 volte e questa particolare routine è stata eseguita settimana dopo settimana per diversi anni quando improvvisamente viene visualizzato l'errore 1025 Impossibile rinominare il problema in un punto casuale nel batch.

Nel mio caso l'applicazione utilizzava 4 istruzioni DDL a CREATE TABLE seguita da 3 CREATE INDEX, non esiste una chiave esterna. Tuttavia, solo 2 degli indici vengono effettivamente creati e il file .frm della tabella effettiva è stato rinominato, al punto di errore.

La mia soluzione era quella di sbarazzarmi delle istruzioni CREATE INDEX separate e crearle usando l'istruzione CREATE TABLE. Questo al momento della scrittura ha risolto il problema per me e per il mio aiuto qualcun altro che si gratta la testa quando trova questo thread.


-2

averageRatings = FOREACH groupedRatings GENERATE group AS movieID, AVG (rating.rating) AS avgRating, COUNT (rating.rating) AS numRatings;

Se si utilizza un comando come sopra, è necessario utilizzare il gruppo in lettere minuscole. Questo potrebbe risolvere il tuo problema ha risolto il mio. Almeno nello script PIG.


Non penso che questo sia legato al problema, lui o lei sta colpendo il problema mysql
Zdenek Machek
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.