515 Stimmen

Wann ist "ON UPDATE CASCADE" zu verwenden?

Yo uso ON DELETE CASCADE regelmäßig, aber ich benutze nie ON UPDATE CASCADE da ich mir nicht sicher bin, in welcher Situation sie nützlich sein wird.

Um die Diskussion zu erleichtern, 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
);

Für ON DELETE CASCADE wenn ein Elternteil mit einer id gelöscht wird, wird ein Datensatz im Kind mit parent_id = parent.id werden automatisch gelöscht. Dies sollte kein Problem sein.

  1. Dies bedeutet, dass ON UPDATE CASCADE dasselbe tun wird, wenn id des Elternteils aktualisiert wird?

  2. Wenn (1) wahr ist, bedeutet dies, dass es nicht notwendig ist, die ON UPDATE CASCADE si parent.id nicht aktualisierbar ist (oder nie aktualisiert wird), wie wenn es AUTO_INCREMENT oder immer so eingestellt sein TIMESTAMP . Ist das richtig?

  3. Wenn (2) nicht zutrifft, in welcher anderen Situation sollten wir die ON UPDATE CASCADE ?

  4. Was passiert, wenn ich (aus irgendeinem Grund) die child.parent_id als etwas, das nicht existiert, wird es dann automatisch gelöscht?

Nun, ich weiß, einige der Frage oben kann programmatisch getestet werden, um zu verstehen, aber ich möchte auch wissen, ob einer dieser Datenbankanbieter abhängig ist oder nicht.

Bitte klären Sie mich auf.

5voto

David L Punkte 978

Das ist eine ausgezeichnete Frage, ich hatte gestern die gleiche Frage. Ich habe über dieses Problem nachgedacht, insbesondere darüber, ob es so etwas wie "ON UPDATE CASCADE" gibt, und zum Glück haben die Entwickler von SQL auch daran gedacht. Ich stimme mit Ted.strauss überein, und ich habe auch Norans Fall kommentiert.

Wann habe ich es benutzt? Wie Ted schon sagte, wenn man mehrere Datenbanken gleichzeitig bearbeitet und die Änderung in einer der Datenbanken, in einer Tabelle, irgendeine Art von Reproduktion in einer, wie Ted es nennt, "Satellitendatenbank" hat, nicht mit der ursprünglichen ID beibehalten werden kann und man aus irgendeinem Grund eine neue Datenbank erstellen muss, wenn man die Daten in der alten nicht aktualisieren kann (z.B. aufgrund von Berechtigungen, oder wenn man nach Schnelligkeit in einem Fall sucht, der so flüchtig ist, dass er nicht den absoluten und vollständigen Respekt für die gesamten Regeln der Normalisierung verdient, einfach weil er ein sehr kurzlebiger Nutzen sein wird)

Ich stimme also in zwei Punkten zu:

(A.) Ja, in vielen Fällen kann ein besseres Design dies vermeiden; ABER

(B.) Bei Migrationen, der Replikation von Datenbanken oder der Lösung von Notfällen ist es ein GROSSARTIGES WERKZEUG, das glücklicherweise zur Verfügung stand, als ich mich auf die Suche machte, ob es existiert.

4voto

ted.strauss Punkte 3699

Mein Kommentar bezieht sich hauptsächlich auf Punkt 3: Unter welchen Umständen ist ON UPDATE CASCADE anwendbar, wenn wir davon ausgehen, dass der übergeordnete Schlüssel nicht aktualisierbar ist? Hier ist ein Fall.

Ich habe es mit einem Replikationsszenario zu tun, bei dem mehrere Satellitendatenbanken mit einer Hauptdatenbank zusammengeführt werden müssen. Jeder Satellit erzeugt Daten in denselben Tabellen, so dass die Zusammenführung der Tabellen mit dem Master zu Verletzungen der Eindeutigkeitsbeschränkung führt. Ich versuche, ON UPDATE CASCADE als Teil einer Lösung zu verwenden, bei der ich die Schlüssel bei jeder Zusammenführung neu erhalte. ON UPDATE CASCADE sollte diesen Prozess vereinfachen, indem ein Teil des Prozesses automatisiert wird.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X