Was bedeutet MySQL-Fehler 1025 (HY000): Fehler beim Umbenennen von './foo' (errorno: 150)?

160

Ich habe dies in MySQL versucht:

mysql> alter table region drop column country_id;

Und bekam das:

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

Irgendwelche Ideen? Fremdschlüssel?

Trenton
quelle
@skiphoppy - Versuchst du, einer bereits gegebenen Antwort ein Kopfgeld zu geben? Ist das überhaupt erlaubt? Oder ist Ihr Fall anders. In diesem Fall sollten Sie einen anderen Thread starten?
Rick James
@ RickJames Ja, das ist es. Skiphoppy sollte jedoch ihren Kommentar unter der von ihr gewählten Antwort einfügen, da die Bouty-Nachricht verschwindet, wenn das Kopfgeld abgelaufen ist.
RandomSeed

Antworten:

240

Normalerweise wird dieser Fehler angezeigt, wenn Ihre Tabellen die InnoDB-Engine verwenden. In diesem Fall müssten Sie den Fremdschlüssel löschen, dann die Änderungstabelle ausführen und die Spalte löschen.

Der schwierige Teil ist jedoch, dass Sie den Fremdschlüssel nicht mit dem Spaltennamen löschen können, sondern stattdessen den Namen suchen müssen, der zum Indizieren verwendet wird. Um dies zu finden, geben Sie die folgende Auswahl ein:

SHOW CREATE TABLE-Region;

Dies sollte Ihnen den Namen des Index zeigen, ungefähr so:

CONSTRAINT region_ibfk_1FOREIGN KEY ( country_id) LITERATUR country( id) ON DELETE NO ACTION ON UPDATE NO ACTION

Jetzt einfach ein:

Ändern Sie den Fremdschlüssel für den Tabellenbereich region_ibfk_1.

Und zum Schluss ein:

alter table region drop column country_id;

Und du kannst loslegen!

Jeshurun
quelle
Beachten Sie, dass Sie den Fremdschlüssel und die Spalte auch in einer ALTER TABLE-Abfrage löschen können.
Valentin Grégoire
nett! wir sollten Fremdschlüssel fallen lassen, alles wird gut! Vielen Dank!
Luan D
173

Es ist in der Tat ein Fremdschlüsselfehler, den Sie mit perror herausfinden können:

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

Um mehr Details darüber zu erfahren, was fehlgeschlagen ist, können Sie SHOW ENGINE INNODB STATUSden Abschnitt LATEST FOREIGN KEY ERROR verwenden und nach ihm suchen, der Details darüber enthält, was falsch ist.

In Ihrem Fall ist es höchstwahrscheinlich, dass etwas auf die Spalte country_id verweist.

Harrison Fisk
quelle
2
Wieder zeigte ein anderer irreführender MySQL-Fehler ... Danke.
e2-e4
In phpMyAdmin finden Sie den Status der Engine in Storage Engines , InnoDB , InnoDB Status
Maxence
15

Sie können auch diesen Fehler erhalten, wenn Sie versuchen, einen nicht vorhandenen Fremdschlüssel zu löschen. Stellen Sie daher beim Löschen von Fremdschlüsseln immer sicher, dass diese tatsächlich vorhanden sind.

Wenn der Fremdschlüssel vorhanden ist und dieser Fehler weiterhin angezeigt wird, versuchen Sie Folgendes:

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

// Lege den Fremdschlüssel hier ab!

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

Das macht immer den Trick für mich :)

Jeroen
quelle
1
Ich brauchte dies, als ich wegen eines MySQL-Fehlers zu einem anderen Zeichensatz einer Tabelle wechselte: FEHLER 1025 (HY000): Fehler beim Umbenennen von './table/#sql-14ae_81' in (errno: 150)
Let'sjump
7

Führen Sie einfach die Abfrage "alter table" mit 'KEY' anstelle von 'FOREIGN KEY' in der drop-Anweisung aus. Ich hoffe, es wird helfen, das Problem zu lösen, und die Fremdschlüsseleinschränkung wird gelöscht, und Sie können die Tabellenspalten ändern und die Tabelle löschen.

ALTER TABLE slide_image_sub DROP  KEY  FK_slide_image_sub;

hier in DROP KEYstatt DROP FOREIGN KEY,

hoffe es wird helfen.

Vielen Dank

Muhammad Sohail
quelle
4

Ich weiß, dies ist ein alter Beitrag, aber es ist der erste Treffer in der Lieblingssuchmaschine aller, wenn Sie nach Fehler 1025 suchen.

Es gibt jedoch einen einfachen "Hack", um dieses Problem zu beheben:

Bevor Sie Ihre Befehle ausführen, müssen Sie zunächst die Prüfung der Fremdschlüsseleinschränkungen mit diesem Befehl deaktivieren:

SET FOREIGN_KEY_CHECKS = 0;

Dann können Sie Ihre Befehle ausführen.

Vergessen Sie nicht, die Prüfung der Fremdschlüsseleinschränkungen mit diesem Befehl erneut zu aktivieren, nachdem Sie fertig sind:

SET FOREIGN_KEY_CHECKS = 1;

Viel Glück bei Ihrem Bestreben.

Baccata
quelle
Hatte Probleme bei der Installation von octobercms auf xampp, schließlich half dies.
Jahackbeth
2

Ich hatte einmal ähnliche Probleme. Ich habe den Primärschlüssel aus TABELLE A gelöscht, aber als ich versuchte, die Fremdschlüsselspalte aus Tabelle BI zu löschen, wurde der oben genannte Fehler angezeigt.

Sie können den Fremdschlüssel nicht mit dem Spaltennamen löschen. Um dies in PHPMyAdmin oder mit MySQL zu umgehen, entfernen Sie zuerst die Fremdschlüsseleinschränkung, bevor Sie das Attribut umbenennen oder löschen.

Joomler
quelle
1

Schauen Sie sich die Fehlerdatei für Ihre MySQL-Datenbank an. Laut Bug # 26305 gibt Ihnen mein SQL nicht die Ursache. Dieser Fehler besteht seit MySQL 4.1 ;-)

Marabol
quelle
Ich fand einige Ihrer Antworten schwer zu befolgen, aber +1 für die Verknüpfung mit einem Fehlerbericht. Anscheinend wurde es jetzt in MySQL v5.6.6 behoben. :)
mwfearnley
1

Wenn Sie einen Client wie MySQL Workbench verwenden, klicken Sie mit der rechten Maustaste auf die gewünschte Tabelle, aus der ein Fremdschlüssel gelöscht werden soll. Wählen Sie dann die Registerkarte Fremdschlüssel aus und löschen Sie die Indizes.

Dann können Sie die Abfrage folgendermaßen ausführen:

alter table table_name drop foreign_key_col_name;
iltaf khalid
quelle
1

Es gibt wahrscheinlich eine andere Tabelle mit einem Fremdschlüssel, der auf den Primärschlüssel verweist, den Sie ändern möchten.

Um herauszufinden, welche Tabelle den Fehler verursacht hat, können Sie SHOW ENGINE INNODB STATUSden LATEST FOREIGN KEY ERRORAbschnitt ausführen

Verwenden Sie die Kategorien SHOW CREATE TABLE, um den Namen der Einschränkung anzuzeigen.

Höchstwahrscheinlich wird es Kategorien_ibfk_1 sein

Verwenden Sie den Namen, um zuerst den Fremdschlüssel und dann die Spalte zu löschen:

ALTER TABLE categories DROP FOREIGN KEY categories_ibfk_1;
ALTER TABLE categories DROP COLUMN assets_id;
Youngdero
quelle
1

Tun

SET FOREIGN_KEY_CHECKS=0;

vor der Operation kann auch der Trick tun.

Jan Tchärmän
quelle
0

Ich würde ein Problem mit Fremdschlüsseleinschränkungen vermuten. Wird country_id als Fremdschlüssel in einer anderen Tabelle verwendet?

Ich bin kein DB-Guru, aber ich glaube, ich habe ein Problem wie dieses (wo es eine fk-Einschränkung gab) gelöst, indem ich das fk entfernt, meine Alter-Table-Sachen gemacht und dann die fk-Sachen wiederholt habe.

Ich werde gespannt sein, was das Ergebnis ist - manchmal ist MySQL ziemlich kryptisch.

itsmatt
quelle
MySQL kann schrecklich sein. Normalerweise gut, aber diese Fehlermeldungen, meine Güte. Wenn wir von jemandem im Büro eine kurze Erklärung bekommen, werde ich sie hier hochwerfen.
Trenton
0

In meinem Fall habe ich die MySQL-Workbench verwendet und beim Ablegen einer meiner Spalten in einer Tabelle das gleiche Problem festgestellt. Ich konnte den Namen des Fremdschlüssels nicht finden. Ich habe die folgenden Schritte ausgeführt, um das Problem zu beheben:

  1. Rt. Klicken Sie auf Ihr Schema und wählen Sie "Schema-Inspektor". Dies gibt Ihnen verschiedene Tabellen, Spalten, Indizes, ect.

  2. Gehen Sie zur Registerkarte "Indizes" und suchen Sie den Namen der Spalte unter der Spalte "Spalte". Einmal gefunden, überprüfen Sie den Namen der Tabelle für diesen Datensatz unter dem Spaltennamen 'Tabelle'. Wenn es mit dem Namen der gewünschten Tabelle übereinstimmt, notieren Sie den Namen des Fremdschlüssels in der Spalte "Name".

  3. Führen Sie nun die Abfrage aus: ALTER table tableNamexx DROP KEY ForeignKeyName;

  4. Jetzt können Sie die drop-Anweisung ausführen, die erfolgreich ausgeführt werden soll.

Jatin Shashoo
quelle
0

Ich habe diesen Fehler mit MySQL 5.6 erhalten, aber er hatte nichts mit Fremdschlüsseln zu tun. Dies war auf einem Windows 7 Professional-Computer, der als Server in einem kleinen LAN fungierte.

Die Clientanwendung hat eine Stapeloperation ausgeführt, bei der eine Tabelle erstellt wird, die mit einigen externen Daten gefüllt wird. Anschließend wird eine Abfrage ausgeführt, die mit permanenten Tabellen verknüpft wird, und anschließend die "temporäre" Tabelle gelöscht. Dieser Stapel führt dies ungefähr 300 Mal aus, und diese spezielle Routine wurde mehrere Jahre lang Woche für Woche ausgeführt, als plötzlich der Fehler 1025 angezeigt wird. Das Problem kann an einem zufälligen Punkt im Stapel nicht umbenannt werden.

In meinem Fall verwendete die Anwendung 4 DDL-Anweisungen, eine CREATE TABLE gefolgt von 3 CREATE INDEX. Es gibt keinen Fremdschlüssel. Es werden jedoch nur 2 der Indizes tatsächlich erstellt und die eigentliche Tabelle .frm-Datei wurde zum Zeitpunkt des Fehlers umbenannt.

Meine Lösung bestand darin, die separaten CREATE INDEX-Anweisungen zu entfernen und sie mit der CREATE TABLE-Anweisung zu erstellen. Dies zum Zeitpunkt des Schreibens hat das Problem für mich und meine Hilfe gelöst. Jemand anderes kratzt sich am Kopf, wenn er diesen Thread findet.

Chris Millard
quelle
-2

AverageRatings = FOREACH groupedRatings GENERATE group AS movieID, AVG (Ratings.rating) AS AvgRating, COUNT (Ratings.rating) AS numRatings;

Wenn Sie einen Befehl wie oben verwenden, müssen Sie group in kleinen Buchstaben verwenden. Dies kann Ihr Problem lösen, es hat meins gelöst. Zumindest in PIG-Schrift.

Naman Dhameja
quelle
Ich glaube nicht, dass dies ein Problem ist, er oder sie hat ein MySQL-Problem
Zdenek Machek