限制父子表关系的级联删除
在 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中文网其他相关文章!