Ich verwende regelmäßig "ON DELETE CASCADE", aber niemals "ON UPDATE CASCADE", da ich nicht so sicher bin, in welcher Situation es nützlich sein wird.
Zur Diskussion sehen wir uns einen Code an.
CREATE TABLE parent (
id INT NOT NULL AUTO_INCREMENT,
PRIMARY KEY (id)
);
CREATE TABLE child (
id INT NOT NULL AUTO_INCREMENT, parent_id INT,
INDEX par_ind (parent_id),
FOREIGN KEY (parent_id)
REFERENCES parent(id)
ON DELETE CASCADE
);
Wenn für "ON DELETE CASCADE" ein Elternteil mit einem id
gelöscht wird, wird ein Datensatz in einem Kind mit parent_id = parent.id
automatisch gelöscht. Dies sollte kein Problem sein.
Dies bedeutet, dass "ON UPDATE CASCADE" dasselbe tut, wenn
id
das übergeordnete Element aktualisiert wird.Wenn (1) wahr ist, bedeutet dies, dass "ON UPDATE CASCADE" nicht verwendet werden muss, wenn
parent.id
es nicht aktualisierbar ist (oder niemals aktualisiert wird), wie wenn es istAUTO_INCREMENT
oder immer eingestellt istTIMESTAMP
. Ist das richtig?Wenn (2) nicht wahr ist, in welcher anderen Situation sollten wir "ON UPDATE CASCADE" verwenden?
Was passiert, wenn ich das (aus irgendeinem Grund) so aktualisiere
child.parent_id
, dass es nicht vorhanden ist? Wird es dann automatisch gelöscht?
Nun, ich weiß, einige der oben genannten Fragen können programmgesteuert getestet werden, um zu verstehen, aber ich möchte auch wissen, ob dies vom Hersteller des Datenbankanbieters abhängt oder nicht.
Bitte werfen Sie etwas Licht.