Ich erhalte diese Fehlermeldung:
FEHLER 1217 (23000) in Zeile 40: Eine übergeordnete Zeile kann nicht gelöscht oder aktualisiert werden: Eine Fremdschlüsseleinschränkung schlägt fehl
... wenn ich versuche einen Tisch fallen zu lassen:
DROP TABLE IF EXISTS `area`;
... so definiert:
CREATE TABLE `area` (
`area_id` char(3) COLLATE utf8_spanish_ci NOT NULL,
`nombre_area` varchar(30) COLLATE utf8_spanish_ci NOT NULL,
`descripcion_area` varchar(100) COLLATE utf8_spanish_ci NOT NULL,
PRIMARY KEY (`area_id`),
UNIQUE KEY `nombre_area_UNIQUE` (`nombre_area`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci;
Das Lustige ist, dass ich bereits alle anderen Tabellen im Schema gelöscht habe, gegen die Fremdschlüssel vorhanden sind area
. Tatsächlich ist die Datenbank bis auf die area
Tabelle leer .
Wie kann es möglicherweise untergeordnete Zeilen haben, wenn sich kein anderes Objekt in der Datenbank befindet? Soweit ich weiß, erlaubt InnoDB keine Fremdschlüssel in anderen Schemas, oder?
(Ich kann sogar einen RENAME TABLE area TO something_else
Befehl ausführen : -?)
CONSTRAINT fk_servicio_area1 FOREIGN KEY (area_id) REFERENCES area (area_id)
, dh kein Schemaname in der Tabellenreferenz: -?Antworten:
Zwei Möglichkeiten:
Sie können sehen, um welche Tabelle es sich handelt (eine davon jedenfalls), indem Sie einen "SHOW ENGINE INNODB STATUS" ausführen, nachdem das Löschen fehlgeschlagen ist.
Wenn sich herausstellt, dass dies der letztere Fall ist, würde ich den gesamten Server sichern und wiederherstellen, wenn Sie können.
MySQL 5.1 und höher gibt Ihnen den Namen der Tabelle mit dem FK in der Fehlermeldung.
quelle
SHOW ENGINE INNODB STATUS
Berichte.Auf Anfrage, jetzt als Antwort ...
Bei Verwendung von MySQL Query Browser oder phpMyAdmin wird anscheinend für jede Abfrage eine neue Verbindung geöffnet ( bugs.mysql.com/bug.php?id=8280 ), sodass alle drop-Anweisungen in einer Abfrage geschrieben werden müssen, z.
Wo das
SET FOREIGN_KEY_CHECKS=1
als zusätzliche Sicherheitsmaßnahme dient ...quelle
SET FOREIGN_KEY_CHECKS=0;
zum Beginn des Speicherauszugs hinzugefügt wird .Deaktivieren Sie die Fremdschlüsselprüfung
quelle
SET FOREIGN_KEY_CHECKS=0
und behebt die Fehlermeldung. Haben Sie eine Vorstellung davon, warum dies erforderlich ist? Werden Fremdschlüssel auch nach dem Wegfall der Tabellen zwischengespeichert?SET FOREIGN_KEY_CHECKS=1;
Sie fertig sind!SET FOREIGN_KEY_CHECKS=0; DROP TABLE my_first_table_to_drop; DROP TABLE my_second_table_to_drop; SET FOREIGN_KEY_CHECKS=1;
Wobei das SET FOREIGN_KEY_CHECKS = 1 als zusätzliche Sicherheitsmaßnahme dient ...von diesem Blog :
Sie können Fremdschlüsselprüfungen vorübergehend deaktivieren:
Stellen Sie einfach sicher, dass Sie sie wiederherstellen, wenn Sie fertig sind:
quelle
hoffentlich seine Arbeit
SET Foreign_key_checks = 0; TROPFENTABELLE
table name
; SET Foreign_key_checks = 1;quelle
Auf Schienen kann man Folgendes tun mit
rails console
:quelle
Möglicherweise haben Sie beim Arbeiten mit dieser Tabelle zuvor einen Fehler erhalten. Sie können die Tabelle umbenennen und erneut versuchen, sie zu entfernen.
quelle
Ich fand eine einfache Lösung, exportierte die Datenbank, bearbeitete sie, was Sie in einem Texteditor bearbeiten möchten, und importierte sie dann. Getan
quelle
CREATE TABLE
Code entfernen und den Speicherauszug erneut laden, wird MySQL die Tabelle nicht entfernen. Und wenn Sie meinen, den Speicherauszug in einer neuen Datenbank wiederherzustellen ... Wenn Sie alle Tabellen wie mich löschen möchten, ist eine neu erstellte Datenbank bereits leer. Wenn Sie einige Tabellen behalten möchten,SET FOREIGN_KEY_CHECKS=0
funktioniert die hier überall erwähnte Problemumgehung einwandfrei und ist einfacher. und Sie müssen den Speicherauszug wahrscheinlich sowieso nicht bearbeiten, da die neue Kopie Ihrer Daten möglicherweise kein nicht synchrones Datenwörterbuch enthält.Eine übergeordnete Zeile kann nicht gelöscht oder aktualisiert werden: Eine Fremdschlüsseleinschränkung schlägt fehl (
table1
.user_role
, CONSTRAINTFK143BF46A8dsfsfds@#5A6BD60
FOREIGN KEY (user_id
) REFERENCESuser
(.id
))Was ich in zwei einfachen Schritten gemacht habe. Zuerst lösche ich die untergeordnete Zeile in der untergeordneten Tabelle wie
mysql> aus Tabelle2 löschen, wobei role_id = 2 && user_id = 20;
Abfrage OK, 1 Zeile betroffen (0,10 Sek.)
und zweiter Schritt als Löschen des übergeordneten Elements
aus Tabelle1 löschen, wobei id = 20;
Abfrage OK, 1 Zeile betroffen (0,12 Sek.)
Damit löse ich das Problem, was bedeutet, Kind löschen, dann Eltern löschen
Ich hoffe du hast es verstanden. :) :)
quelle