Heim > Datenbank > MySQL-Tutorial > Wie kann man kaskadierende Löschvorgänge in MySQL-Eltern-Kind-Beziehungen verhindern?

Wie kann man kaskadierende Löschvorgänge in MySQL-Eltern-Kind-Beziehungen verhindern?

Barbara Streisand
Freigeben: 2024-12-14 18:14:11
Original
900 Leute haben es durchsucht

How to Prevent Cascading Deletes in MySQL Parent-Child Relationships?

Kaskadierende Löschvorgänge für Eltern-Kind-Tabellenbeziehungen einschränken

Bei der Verwendung von Fremdschlüsseln zur Aufrechterhaltung der Datenintegrität in MySQL ist es wichtig, die Auswirkungen zu verstehen von kaskadierenden Löschvorgängen. Mit der Klausel „ON DELETE CASCADE“ können Sie untergeordnete Datensätze automatisch löschen, wenn der übergeordnete Datensatz gelöscht wird. Wenn Sie jedoch kaskadierende Löschvorgänge verhindern möchten, die zu verwaisten untergeordneten Datensätzen führen würden, müssen Sie Ihre Fremdschlüssel sorgfältig konfigurieren.

Beispiel: Kategorie-Produkt-Beziehung

Bedenken Sie die folgenden Beispieltabellen:

CREATE TABLE categories (
    id INT PRIMARY KEY,
    name VARCHAR(255)
);

CREATE TABLE products (
    id INT PRIMARY KEY,
    name VARCHAR(255)
);

CREATE TABLE categories_products (
    category_id INT,
    product_id INT,
    PRIMARY KEY (category_id, product_id),
    FOREIGN KEY (category_id) REFERENCES categories(id)
       ON DELETE CASCADE
       ON UPDATE CASCADE,
    FOREIGN KEY (product_id) REFERENCES products(id)
       ON DELETE CASCADE
       ON UPDATE CASCADE
);
Nach dem Login kopieren

Wenn Sie eine Kategorie löschen, werden normalerweise alle damit verbundenen Produkte kaskadiert und gelöscht Kategorie, unabhängig davon, ob diese Produkte auch zu anderen Kategorien gehören.

Korrekte Einrichtung des Fremdschlüssels

Um dieses unerwünschte kaskadierende Verhalten zu verhindern, müssen Sie die Fremdschlüsseldefinition ändern in der Tabelle „categories_products“:

CREATE TABLE categories_products (
    category_id INT,
    product_id INT,
    PRIMARY KEY (category_id, product_id),
    FOREIGN KEY (category_id) REFERENCES categories(id)
       ON DELETE SET NULL
       ON UPDATE CASCADE,
    FOREIGN KEY (product_id) REFERENCES products(id)
       ON DELETE CASCADE
       ON UPDATE CASCADE
);
Nach dem Login kopieren

Indem Sie die ON DELETE-Regel in SET NULL ändern, weisen Sie MySQL an, die festzulegen Wenn eine Kategorie gelöscht wird, wird die Spalte „category_id“ in der Tabelle „categories_products“ auf NULL gesetzt. Dadurch wird die Zuordnung zwischen der Kategorie und dem Produkt entfernt, das Produkt selbst wird jedoch nicht gelöscht.

Selektive Kaskadierung

Dieser Ansatz stellt sicher, dass das Löschen einer Kategorie nur erfolgt kaskadieren und löschen Sie die Produkte, die ausschließlich dieser Kategorie zugeordnet sind. Produkte, die zu mehreren Kategorien gehören, bleiben davon unberührt.

Berücksichtigen Sie beispielsweise die folgenden Daten:

categories:     products:
+----+---------+   +----+--------+
| id | name     |   | id | name   |
+----+---------+   +----+--------+
| 1  | Apparel  |   | 1  | Shirt  |
| 2  | Electronics |   | 2  | Phone  |
+----+---------+   +----+--------+

categories_products:
+------------+-------------+
| product_id | category_id |
+------------+-------------+
| 1          | 1           | // Apparel - Shirt
| 1          | 2           | // Electronics - Shirt
| 2          | 2           | // Electronics - Phone
+------------+-------------+
Nach dem Login kopieren

Wenn Sie die Kategorie „Bekleidung“ löschen, wird nur der Eintrag „Bekleidung – Hemd“ gelöscht die Tabelle „categories_products“. Das T-Shirt-Produkt (ID = 1) wird weiterhin existieren, da es auch der Kategorie „Elektronik“ zugeordnet ist.

Das obige ist der detaillierte Inhalt vonWie kann man kaskadierende Löschvorgänge in MySQL-Eltern-Kind-Beziehungen verhindern?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage