首页 > 数据库 > mysql教程 > 如何防止MySQL父子关系中的级联删除?

如何防止MySQL父子关系中的级联删除?

Barbara Streisand
发布: 2024-12-14 18:14:11
原创
902 人浏览过

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

限制父子表关系的级联删除

在 MySQL 中使用外键维护数据完整性时,了解其影响非常重要级联删除。 “ON DELETE CASCADE”子句允许您在删除父记录时自动删除子记录。但是,如果您需要防止级联删除导致孤立子记录,则必须仔细配置外键。

示例:类别-产品关系

考虑以下示例表:

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
);
登录后复制

如果删除一个类别,它通常会级联并删除所有关联的产品

正确的外键设置

为了防止这种不良的级联行为,您必须修改外键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
);
登录后复制

通过将 ON DELETE 规则更改为 SET NULL,您可以当删除类别时,指示 MySQL 将categories_products 表中的category_id 列设置为NULL。这将删除类别和产品之间的关联,但不会删除产品本身。

选择性级联

这种方法确保删除类别只会级联并删除与该类别专门关联的产品。属于多个类别的产品将不受影响。

例如,考虑以下数据:

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
+------------+-------------+
登录后复制

如果删除服装类别,只会删除服装 - 衬衫条目类别_产品表。衬衫产品 (id = 1) 仍然存在,因为它也与电子产品类别相关联。

以上是如何防止MySQL父子关系中的级联删除?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板