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