我想使用外键来保持完整性并避免使用孤立键(我已经使用过innoDB)。
如何创建在CASCADE上删除的SQL语句?
如果我删除一个类别,那么如何确保它不会删除也与其他类别相关的产品。
数据透视表“ categories_products”在其他两个表之间创建多对多关系。
categories - id (INT) - name (VARCHAR 255) products - id - name - price categories_products - categories_id - products_id
如果您的级联删除某个产品是因为该产品属于被杀类别的成员,那么它会删除该产品,那么您的外键设置不正确。给定示例表,您应该具有以下表设置:
CREATE TABLE categories ( id int unsigned not null primary key, name VARCHAR(255) default null )Engine=InnoDB; CREATE TABLE products ( id int unsigned not null primary key, name VARCHAR(255) default null )Engine=InnoDB; CREATE TABLE categories_products ( category_id int unsigned not null, product_id int unsigned not null, PRIMARY KEY (category_id, product_id), KEY pkey (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 )Engine=InnoDB;
这样,您可以删除产品或类别,只有category_products中的关联记录会一起消失。级联将不会沿着树走得更远,并删除父产品/类别表。
例如
products: boots, mittens, hats, coats categories: red, green, blue, white, black prod/cats: red boots, green mittens, red coats, black hats
如果删除“红色”类别,则类别表中的“红色”条目以及两个条目prod / cats:“红色靴子”和“红色外套”都会消失。
删除操作不会进一步进行,也不会删除“靴子”和“外套”类别。
评论跟进:
您仍然误解了级联删除的工作方式。它们仅影响定义了“删除时级联”的表。在这种情况下,级联设置在“ categories_products”表中。如果您删除“红色”类别,则将在category_products中级联删除的唯一记录是那些category_id = red。它不会触及“ category_id = blue”的任何记录,也不会继续传递到“产品”表,因为该表中没有定义外键。
category_id = red
这是一个更具体的示例:
categories: products: +----+------+ +----+---------+ | id | name | | id | name | +----+------+ +----+---------+ | 1 | red | | 1 | mittens | | 2 | blue | | 2 | boots | +---++------+ +----+---------+ products_categories: +------------+-------------+ | product_id | category_id | +------------+-------------+ | 1 | 1 | // red mittens | 1 | 2 | // blue mittens | 2 | 1 | // red boots | 2 | 2 | // blue boots +------------+-------------+
假设您删除类别2(蓝色):
DELETE FROM categories WHERE (id = 2);
DBMS将查看所有具有指向“类别”表的外键的表,并删除匹配ID为2的记录。由于我们仅在中定义了外键关系products_categories,所以一旦删除完成:
products_categories
+------------+-------------+ | product_id | category_id | +------------+-------------+ | 1 | 1 | // red mittens | 2 | 1 | // red boots +------------+-------------+
该products表中没有定义外键,因此级联将无法在其中工作,因此仍然列出了靴子和连指手套。不再有“蓝色靴子”和“蓝色手套”了。
products