Maison >base de données >tutoriel mysql >Comment ON DELETE CASCADE affecte-t-il les tables associées dans les contraintes de clé étrangère MySQL ?

Comment ON DELETE CASCADE affecte-t-il les tables associées dans les contraintes de clé étrangère MySQL ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-15 05:43:08542parcourir

How Does ON DELETE CASCADE Affect Related Tables in MySQL Foreign Key Constraints?

Contraintes de clé étrangère MySQL avec suppression en cascade

Les contraintes de clé étrangère jouent un rôle essentiel dans le maintien de l'intégrité des données et la prévention des orphelins dans les bases de données relationnelles. Dans MySQL, vous pouvez utiliser l'option ON DELETE CASCADE pour garantir que lorsque vous supprimez un enregistrement parent, les enregistrements enfants associés sont également automatiquement supprimés.

Pour configurer une contrainte de clé étrangère avec suppression en cascade, considérez ce qui suit tables :

CREATE TABLE categories (
    id INT NOT NULL PRIMARY KEY,
    name VARCHAR(255) DEFAULT NULL
) ENGINE=InnoDB;

CREATE TABLE products (
    id INT NOT NULL PRIMARY KEY,
    name VARCHAR(255) DEFAULT NULL,
    category_id INT NOT NULL
) ENGINE=InnoDB;

CREATE TABLE categories_products (
    category_id INT NOT NULL,
    product_id INT NOT NULL,
    PRIMARY KEY (category_id, product_id)
) ENGINE=InnoDB;

ALTER TABLE products
ADD FOREIGN KEY (category_id) REFERENCES categories (id)
ON DELETE CASCADE;

Dans cette configuration, les produits ont une clé étrangère faisant référence aux catégories, et ON DELETE CASCADE est spécifié pour supprimer automatiquement les produits lorsque la catégorie référencée est supprimée. Cependant, cette cascade n'affectera que les enregistrements danscategors_products où lecategory_id correspond à la catégorie supprimée.

Par exemple, si vous disposez des données suivantes :

categories:
+----+------+
| id | name |
+----+------+
| 1  | red  |
| 2  | blue |
+----+------+

products:
+----+---------+------+
| id | name    | category_id |
+----+---------+------+
| 1  | mittens | 1           |
| 2  | boots   | 1           |
| 3  | gloves  | 2           |
+----+---------+------+

categories_products:
+------------+-------------+
| category_id | product_id |
+------------+-------------+
| 1          | 1           |
| 1          | 2           |
| 2          | 3           |
+------------+-------------+

Si vous supprimez le 'rouge' category:

DELETE FROM categories WHERE (id = 1);

La table products ne sera pas affectée car la cascade ne s'applique qu'à la tablecategories_products. En conséquence, les données deviendront :

categories:
+----+------+
| id | name |
+----+------+
| 2  | blue |
+----+------+

products:
+----+---------+------+
| id | name    | category_id |
+----+---------+------+
| 2  | boots   | 1           |
| 3  | gloves  | 2           |
+----+---------+------+

categories_products:
+------------+-------------+
| category_id | product_id |
+------------+-------------+
| 2          | 3           |
+------------+-------------+

Cet arrangement garantit que vous pouvez maintenir l'intégrité référentielle tout en évitant la suppression involontaire d'enregistrements non liés.

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!

Déclaration:
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