Ich habe dies in MySQL versucht:
mysql> alter table region drop column country_id;
Und habe folgendes bekommen:
ERROR 1025 (HY000): Error on rename of './product/#sql-14ae_81' to
'./product/region' (errno: 150)
Irgendwelche Ideen? Fremdschlüssel Zeug?
Diese Fehlermeldung wird normalerweise angezeigt, wenn Ihre Tabellen die InnoDB-Engine verwenden. In diesem Fall müssten Sie den Fremdschlüssel löschen und dann die Änderungstabelle ausführen und die Spalte löschen.
Der knifflige Teil ist jedoch, dass Sie den Fremdschlüssel nicht mit dem Spaltennamen löschen können, sondern stattdessen den Namen suchen müssen, der für die Indexierung verwendet wird. Um das zu finden, gib folgende Auswahl aus:
SHOW CREATE TABLE Bereich;
Hier sollte der Name des Index angezeigt werden, etwa wie folgt:
CONSTRAINT
region_ibfk_1
FOREIGN KEY (country_id
) REFERENCEScountry
(id
) ON DELETE NO AKTION AUF AKTUALISIERUNG KEINE AKTION
Jetzt einfach ein:
Ändern Sie den Tabellenbereich und löschen Sie den Fremdschlüssel
region_ibfk_1
;
Und zum Schluss noch ein:
Ändern Sie die Spalte für den Tabellenbereich country_id;
Und du bist gut zu gehen!
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 weitere Details zu erfahren, was fehlgeschlagen ist, können Sie SHOW ENGINE INNODB STATUS
verwenden und den Abschnitt LATEST FOREIGN KEY ERROR suchen. Dort finden Sie Details zu den Fehlern.
In Ihrem Fall ist es höchstwahrscheinlich, dass etwas auf die Spalte country_id verweist.
Sie können diesen Fehler auch erhalten, wenn Sie versuchen, einen nicht vorhandenen Fremdschlüssel zu löschen. Wenn Sie Fremdschlüssel ablegen, stellen Sie immer sicher, dass sie tatsächlich vorhanden sind.
Wenn der Fremdschlüssel vorhanden ist und Sie diesen Fehler immer noch erhalten, versuchen Sie Folgendes:
SET @[email protected]@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @[email protected]@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @[email protected]@SQL_MODE, SQL_MODE='TRADITIONAL';
// Lass den Fremdschlüssel hier fallen!
SET [email protected]_SQL_MODE;
SET [email protected]_FOREIGN_KEY_CHECKS;
SET [email protected]_UNIQUE_CHECKS;
Das macht immer den Trick für mich :)
Führen Sie einfach die Abfrage der Alterstabelle mit 'KEY' anstelle von 'FOREIGN KEY' in der Drop-Anweisung aus. Ich hoffe, es hilft beim Lösen des Problems und löscht die Fremdschlüsseleinschränkung. 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 KEY
anstelle von DROP FOREIGN KEY
,
hoffe es wird helfen.
Vielen Dank
Ich weiß, dies ist ein alter Beitrag, aber es ist der erste Treffer in jeder bevorzugten Suchmaschine, 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 Überprü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 Überprüfung der Fremdschlüsseleinschränkungen erneut zu aktivieren, indem Sie diesen Befehl verwenden:
SET FOREIGN_KEY_CHECKS = 1;
Viel Glück bei deinen Bemühungen.
Ich hatte einmal ein ähnliches Problem. Ich habe den Primärschlüssel aus TABELLE A gelöscht, aber als ich versuchte, die Fremdschlüsselspalte aus Tabelle B zu löschen, wurde mir derselbe Fehler angezeigt.
Sie können den Fremdschlüssel nicht mit dem Spaltennamen löschen. Um dies in PHPMyAdmin oder MySQL zu umgehen, entfernen Sie zunächst die Fremdschlüsseleinschränkung, bevor Sie das Attribut umbenennen oder löschen.
Tun
SET FOREIGN_KEY_CHECKS=0;
bevor die Operation auch den Trick machen kann.
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 wie folgt ausführen:
alter table table_name drop foreign_key_col_name;
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
STATUS
ausführen und dann den Abschnitt LATEST FOREIGN KEY ERROR
anzeigen
Verwenden Sie die SHOW CREATE TABLE-Kategorien, um den Namen der Einschränkung anzuzeigen.
Am wahrscheinlichsten wird es categories_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;
Schauen Sie sich die Fehlerdatei Ihrer mysql-Datenbank an. Laut Fehler # 26305 mein SQL gibt Ihnen nicht die Ursache. Dieser Fehler existiert seit MySQL 4.1 ;-)
Ich schätze das Fremdschlüsselproblem. Wird country_id in einer anderen Tabelle als Fremdschlüssel verwendet?
Ich bin kein DB-Guru, aber ich denke, ich habe ein Problem wie dieses gelöst (wo es eine Einschränkung für die fk gab), indem ich die fk entfernte, mein Alter-Table-Zeug mache und dann das fk-Zeug neu mache.
Ich bin gespannt, was das Ergebnis ist - manchmal ist mysql ziemlich kryptisch.
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 mit einigen externen Daten gefüllt wird. Anschließend wird eine Abfrage ausgeführt, die mit permanenten Tabellen verbunden wird. Anschließend wird die "temporäre" Tabelle gelöscht. Dieser Stapel macht dies etwa 300 Mal, und diese bestimmte Routine wurde mehrere Jahre lang Woche für Woche ausgeführt, als plötzlich der Fehler 1025 auftauchte.
In meinem Fall verwendete die Anwendung 4 DDL-Anweisungen, CREATE TABLE gefolgt von 3 CREATE INDEX. Es ist kein Fremdschlüssel vorhanden. Es werden jedoch nur zwei der Indizes erstellt und die tatsächliche .frm-Datei der Tabelle 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 hat zum Zeitpunkt des Schreibens das Problem für mich und meine Hilfe gelöst, wenn jemand anderes den Kopf kratzte, wenn er diesen Thread findet.
In meinem Fall habe ich die MySQL-Workbench verwendet, und ich hatte das gleiche Problem, als ich eine meiner Spalten in einer Tabelle ablegte. Ich konnte den Namen des Fremdschlüssels nicht finden. Ich habe die folgenden Schritte ausgeführt, um das Problem zu beheben:
Rt. Klicken Sie auf Ihr Schema und wählen Sie "Schema-Inspektor". Dies gibt Ihnen verschiedene Tabellen, Spalten, Indizes, ect.
Gehen Sie auf die Registerkarte "Indizes" und suchen Sie den Namen der Spalte unter der Spalte "Spalte". Sobald Sie gefunden wurden, überprüfen Sie den Namen der Tabelle für diesen Datensatz unter der Spalte "Tabelle". Wenn es mit dem Namen der gewünschten Tabelle übereinstimmt, notieren Sie sich den Namen des Fremdschlüssels aus der Spalte "Name".
Führen Sie nun die Abfrage aus: ALTER-Tabelle tableNamexx DROP KEY foreignKeyName;
Jetzt können Sie die Drop-Anweisung ausführen, die erfolgreich ausgeführt werden soll.