Referenzielle Integrität, löschen von Daten
WernerK
- datenbank
Hallo,
Das Thema "InnoDB" und Referenzielle Integrität ist für mich neu.
Ich habe daher mal testweise folgende Tabellen mit PhpMyAdmin erstellt.
CREATE TABLE parent
(
id INT NOT NULL AUTO_INCREMENT,
PRIMARY KEY (id)
) ENGINE=INNODB;
CREATE TABLE child
(
id INT,
parent_id INT,
FOREIGN KEY (parent_id) REFERENCES parent(id)
) ENGINE=INNODB;
Tabelle parent
id 1
id 2
Tabelle child
id , parent_id
4, 1
5, 2
Wenn ich nun aus der Tabelle parent die Zeile mit id = 1 löschen möchte, kommt es zu einer Fehlermeldung wie;
Cannot delete or update a parent row: a foreign key constraint fails ..
Dies ist ja auch so gewünscht wegen der Foreign Ky Referenz.
Wie geht man hier jetzt aber "richtig" vor?
Muss man immer zuerst aus der "child" Tabelle löschen und dann aus der "parent", also zwei Delete Befehle?
Und noch eine Frage:
Gibt es eine Möglichkeit die "Abhängigkeiten" bzw. Integrität zwischen den Tabellen mit PhpMyAdmin zu erkennen, oder irgendwie anzuzeigen?
vielen Dank
Gruss
Werner
Tach!
Wenn ich nun aus der Tabelle parent die Zeile mit id = 1 löschen möchte, kommt es zu einer Fehlermeldung wie;
Cannot delete or update a parent row: a foreign key constraint fails ..
Dies ist ja auch so gewünscht wegen der Foreign Ky Referenz.
Wie geht man hier jetzt aber "richtig" vor?
Muss man immer zuerst aus der "child" Tabelle löschen und dann aus der "parent", also zwei Delete Befehle?
Nein. Es komt darauf an, wie du den Foreign Key Constraint aufgesetzt hast. Default ist wohl ON DELETE RESTRICT und ON UPDATE ebenso. Statt RESTRICT kann aber auch CASCADE, SET NULL und NO ACTION eingestellt werden.
Gibt es eine Möglichkeit die "Abhängigkeiten" bzw. Integrität zwischen den Tabellen mit PhpMyAdmin zu erkennen, oder irgendwie anzuzeigen?
Ja. Table -> Structure -> Relation View. Wobei "Internal relation" nur eine Einstellung ist, mit dem man dem PMA die Abhängigkeiten erklären kann, wenn die Engine nicht dazu in der Lage ist.
dedlfix.
Hallo
Nein. Es komt darauf an, wie du den Foreign Key Constraint aufgesetzt hast. Default ist wohl ON DELETE RESTRICT und ON UPDATE ebenso. Statt RESTRICT kann aber auch CASCADE, SET NULL und NO ACTION eingestellt werden.
Also gehen wir mal davon aus die Foreign Key Constraints ist so aufgesetzt.
ALTER TABLE child
ADD CONSTRAINT child\_ibfk\_1
FOREIGN KEY (parent\_id
) REFERENCES parent
(id
);
Also kein CASCADE oder sonst etwas.
Dann bleibt doch beim löschen nur die Möglichkeit zuerst in der "child" Tabelle zu löschen und dann in der "parent" oder?
Gruss
Werner
Tach!
Also gehen wir mal davon aus die Foreign Key Constraints ist so aufgesetzt.
ALTER TABLEchild
ADD CONSTRAINTchild\_ibfk\_1
FOREIGN KEY (parent\_id
) REFERENCESparent
(id
);Also kein CASCADE oder sonst etwas.
Dann bleibt doch beim löschen nur die Möglichkeit zuerst in der "child" Tabelle zu löschen und dann in der "parent" oder?
Dann und indirekt ja, denn wenn du kein ON DELETE spezifizierst, gilt RESTRICT als Defaultwert. Und das lässt Löschungen nur zu, wenn keine Referenzen mehr existieren. Da du da aber was anderes konfigurieren kannst, bist du nicht darauf beschränkt.
dedlfix.