Maison > base de données > tutoriel mysql > Comment empêcher les suppressions en cascade dans les relations parent-enfant MySQL ?

Comment empêcher les suppressions en cascade dans les relations parent-enfant MySQL ?

Barbara Streisand
Libérer: 2024-12-14 18:14:11
original
901 Les gens l'ont consulté

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

Restreindre les suppressions en cascade pour les relations entre tables parent-enfant

Lors de l'utilisation de clés étrangères pour maintenir l'intégrité des données dans MySQL, il est important de comprendre l'impact de suppressions en cascade. La clause "ON DELETE CASCADE" permet de supprimer automatiquement les enregistrements enfants lorsque l'enregistrement parent est supprimé. Toutefois, si vous devez éviter les suppressions en cascade qui entraîneraient des enregistrements d'enfants orphelins, vous devez configurer soigneusement vos clés étrangères.

Exemple : relation catégorie-produit

Considérez les exemples de tableaux suivants :

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
);
Copier après la connexion

Si vous supprimez une catégorie, elle mettra normalement en cascade et supprimera tous les produits associés à cette catégorie, que ce soit ces produits appartiennent également à d'autres catégories.

Configuration appropriée de la clé étrangère

Pour éviter ce comportement en cascade indésirable, vous devez modifier la définition de la clé étrangère dans la table catégories_produits :

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
);
Copier après la connexion

En modifiant la règle ON DELETE sur SET NULL, vous demandez à MySQL de définir la colonnecategory_id dans le la tablecategories_products à NULL lorsqu'une catégorie est supprimée. Cela supprimera l'association entre la catégorie et le produit, mais cela ne supprimera pas le produit lui-même.

Cascade sélective

Cette approche garantit que la suppression d'une catégorie ne fera que cascade et supprimez les produits exclusivement associés à cette catégorie. Les produits appartenant à plusieurs catégories ne seront pas affectés.

Par exemple, considérez les données suivantes :

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
+------------+-------------+
Copier après la connexion

Si vous supprimez la catégorie Vêtements, cela supprimera uniquement l'entrée Vêtements - Chemise de la table catégories_produits. Le produit chemise (id=1) existera toujours car il est également associé à la catégorie Electronique.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal