it-swarm.com.de

Falsche Fremdschlüsseleinschränkungen schlagen fehl

Ich erhalte folgende 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 habe bereits alle anderen Tabellen gelöscht im Schema, die Fremdschlüssel gegen area haben. Tatsächlich ist die Datenbank bis auf die Tabelle area 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 ein RENAME TABLE area TO something_else Befehl :-?)

110

Zwei Möglichkeiten:

  1. Es gibt eine Tabelle in einem anderen Schema ("Datenbank" in der MySQL-Terminologie), die eine FK-Referenz hat
  2. Das interne Datenwörterbuch von innodb ist nicht mit dem von mysql synchron.

Sie können sehen, um welche Tabelle es sich handelt (jedenfalls um eine von ihnen), indem Sie einen "SHOW ENGINE INNODB STATUS" ausführen, nachdem das Löschen fehlgeschlagen ist.

Im letzteren Fall 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.

101
MarkR

Auf Anfrage, jetzt als Antwort ...

Bei der Verwendung von MySQL Query Browser oder phpMyAdmin wird anscheinend für jede Abfrage eine neue Verbindung geöffnet ( bugs.mysql.com/bug.php?id=828 ), sodass das Schreiben des gesamten Abfalls erforderlich ist Anweisungen in einer Abfrage, z.

SET FOREIGN_KEY_CHECKS=0; 
DROP TABLE my_first_table_to_drop; 
DROP TABLE my_second_table_to_drop; 
SET FOREIGN_KEY_CHECKS=1; 

Bei dem die SET FOREIGN_KEY_CHECKS=1 dient als zusätzliche Sicherheitsmaßnahme ...

121
Karlis Rode

Deaktivieren Sie die Fremdschlüsselprüfung

SET FOREIGN_KEY_CHECKS=0
47
Flakron Bytyqi

von dieses Blog :

Sie können Fremdschlüsselprüfungen vorübergehend deaktivieren:

SET FOREIGN_KEY_CHECKS=0;

Stellen Sie sie einfach wieder her, wenn Sie fertig sind:

SET FOREIGN_KEY_CHECKS=1;
28
JackD

hoffentlich seine Arbeit

SET foreign_key_checks = 0; TROPFENTABELLE table name; SET foreign_key_checks = 1;

6
M_ Fa

Auf Rails kann man mit dem Rails console:

connection = ActiveRecord::Base.connection
connection.execute("SET FOREIGN_KEY_CHECKS=0;")
1
yeyo

ich habe eine einfache Lösung gefunden, exportiere die Datenbank, bearbeite das, was du bearbeiten möchtest, in einem Texteditor und importiere es dann. Getan

0
Abdulrahman K

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.

ALTER TABLE `area` RENAME TO `area2`;
DROP TABLE IF EXISTS `area2`;
0