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.

587voto

C-Pound Guru Punkte 15319

Es stimmt, wenn Ihr Primärschlüssel nur ein Identitätswert ist, der automatisch inkrementiert wird, haben Sie keine wirkliche Verwendung für ON UPDATE CASCADE .

Angenommen, Ihr Primärschlüssel ist ein 10-stelliger UPC-Strichcode und Sie müssen ihn aufgrund einer Erweiterung in einen 13-stelligen UPC-Strichcode ändern. In diesem Fall, ON UPDATE CASCADE ermöglicht es Ihnen, den Wert des Primärschlüssels zu ändern, und alle Tabellen, die Fremdschlüsselverweise auf diesen Wert haben, werden entsprechend geändert.

In Bezug auf Nr. 4: Wenn Sie die untergeordnete ID in etwas ändern, das in der übergeordneten Tabelle nicht vorhanden ist (und Sie haben referentielle Integrität), sollten Sie einen Fremdschlüsselfehler erhalten.

118voto

Zed Punkte 55390
  1. Ja, das bedeutet, dass zum Beispiel, wenn Sie UPDATE parent SET id = 20 WHERE id = 10 alle Kinder, die eine Eltern-ID von 10 haben, werden ebenfalls auf 20 aktualisiert

  2. Wenn Sie das Feld, auf das sich der Fremdschlüssel bezieht, nicht aktualisieren, ist diese Einstellung nicht erforderlich

  3. Ich kann mir keine andere Verwendung vorstellen.

  4. Das ist nicht möglich, da die Fremdschlüssel-Beschränkung fehlschlagen würde.

36voto

marc_s Punkte 701497

Ich denke, Sie haben so ziemlich alles auf den Punkt gebracht!

Wenn Sie sich an die bewährten Praktiken des Datenbankdesigns halten und Ihr Primärschlüssel niemals aktualisierbar ist (was meiner Meinung nach sowieso immer der Fall sein sollte), dann brauchen Sie die ON UPDATE CASCADE Klausel.

Zed einen guten Punkt gemacht, dass, wenn Sie eine natürlich Schlüssel (z. B. ein reguläres Feld aus Ihrer Datenbanktabelle) als Primärschlüssel verwenden, kann es Situationen geben, in denen Sie Ihre Primärschlüssel aktualisieren müssen. Ein weiteres aktuelles Beispiel wäre die ISBN (International Standard Book Numbers), die vor nicht allzu langer Zeit von 10 auf 13 Ziffern+Zeichen geändert wurde.

Dies ist nicht der Fall, wenn Sie sich für die Verwendung von Surrogat (z. B. künstlich vom System erzeugte) Schlüssel als Primärschlüssel (was ich in allen außer den seltensten Fällen bevorzugen würde).

Fazit: Wenn sich Ihr Primärschlüssel nie ändert, dann brauchen Sie die ON UPDATE CASCADE Klausel.

Marc

21voto

Ariel Grabijas Punkte 1412

Vor ein paar Tagen hatte ich ein Problem mit Triggern, und ich habe herausgefunden, dass ON UPDATE CASCADE nützlich sein kann. Schauen Sie sich dieses Beispiel an (PostgreSQL):

CREATE TABLE club
(
    key SERIAL PRIMARY KEY,
    name TEXT UNIQUE
);

CREATE TABLE band
(
    key SERIAL PRIMARY KEY,
    name TEXT UNIQUE
);

CREATE TABLE concert
(
    key SERIAL PRIMARY KEY,
    club_name TEXT REFERENCES club(name) ON UPDATE CASCADE,
    band_name TEXT REFERENCES band(name) ON UPDATE CASCADE,
    concert_date DATE
);

In meinem Problem musste ich einige zusätzliche Operationen (Trigger) für die Aktualisierung der Tabelle des Konzerts definieren. Diese Operationen mussten club_name und band_name ändern. Das konnte ich wegen der Referenz nicht tun. Ich konnte die Tabelle concert nicht ändern und dann die Tabellen club und band bearbeiten. Ich konnte es auch nicht andersherum machen. ON UPDATE CASCADE war der Schlüssel zur Lösung des Problems.

9voto

Guido Mocha Punkte 1238

El ON UPDATE y ON DELETE geben an, welche Aktion ausgeführt werden soll, wenn eine Zeile in der übergeordneten Tabelle aktualisiert und gelöscht wird. Die folgenden Aktionen sind zulässig: NO ACTION , CASCADE , SET NULL y SET DEFAULT .

Aktionen zum Löschen von Zeilen in der übergeordneten Tabelle

Wenn Sie eine oder mehrere Zeilen in der übergeordneten Tabelle löschen, können Sie eine der folgenden Aktionen festlegen:

  • ON DELETE NO ACTION : SQL Server gibt einen Fehler aus und macht die Löschaktion für die Zeile in der übergeordneten Tabelle rückgängig.
  • ON DELETE CASCADE : SQL Server löscht die Zeilen in der untergeordneten Tabelle, die der aus der übergeordneten Tabelle gelöschten Zeile entspricht.
  • ON DELETE SET NULL : SQL Server setzt die Zeilen in der untergeordneten Tabelle auf NULL, wenn die entsprechenden Zeilen in der übergeordneten Tabelle gelöscht werden. Um diese Aktion auszuführen, müssen die Fremdschlüsselspalten nullbar sein.
  • ON DELETE SET DEFAULT : SQL Server setzt die Zeilen in der untergeordneten Tabelle auf ihre Standardwerte, wenn die entsprechenden Zeilen in der übergeordneten Tabelle gelöscht werden. Um diese Aktion auszuführen, müssen die Fremdschlüsselspalten Standarddefinitionen haben. Beachten Sie, dass eine löschbare Spalte den Standardwert NULL hat, wenn kein Standardwert angegeben ist. Standardmäßig wendet SQL Server DELETE NO ACTION an, wenn Sie nicht explizit eine Aktion angeben.

Aktualisierungsaktion von Zeilen in der übergeordneten Tabelle

Wenn Sie eine oder mehrere Zeilen in der übergeordneten Tabelle aktualisieren, können Sie eine der folgenden Aktionen festlegen:

  • ON UPDATE NO ACTION : SQL Server gibt einen Fehler aus und macht die Aktualisierungsaktion für die Zeile in der übergeordneten Tabelle rückgängig.
  • ON UPDATE CASCADE : SQL Server aktualisiert die entsprechenden Zeilen in der untergeordneten Tabelle, wenn die Zeilen in der übergeordneten Tabelle aktualisiert werden.
  • ON UPDATE SET NULL : SQL Server setzt die Zeilen in der untergeordneten Tabelle auf NULL, wenn die entsprechende Zeile in der übergeordneten Tabelle aktualisiert wird. Beachten Sie, dass die Fremdschlüsselspalten nullbar sein müssen, damit diese Aktion ausgeführt werden kann.
  • ON UPDATE SET DEFAULT : SQL Server setzt die Standardwerte für die Zeilen in der untergeordneten Tabelle, die die entsprechenden Zeilen in der übergeordneten Tabelle aktualisiert haben.

    FOREIGN KEY (foreign_key_columns) REFERENCES parent_table(parent_key_columns) ON UPDATE <action> ON DELETE <action>;

Siehe das Referenz-Tutorial .

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