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 );
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 );
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 +------------+-------------+
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!