mysql级联删除外键约束_MySQL外键约束,级联删除

如果您的级联删除因为是被杀死的类别的成员而删除一个产品,那么您不正确地设置了您的外键。给定您的示例表,您应该具有以下表设置:

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;

这样,您可以删除产品或类别,而且只有categories_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”表中设置级联。如果您删除“红色”类别,则在categories_products中级联删除的唯一记录是category_id = red的记录。它不会触摸“category_id = blue”的任何记录,也不会向前移动到“products”表,因为该表中没有定义外键。

这里有一个更具体的例子:

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中的外键关系,所以最后一次是该表删除完成:

+------------+-------------+

| product_id | category_id |

+------------+-------------+

| 1 | 1 | // red mittens

| 2 | 1 | // red boots

+------------+-------------+

在产品表中没有定义外键,所以级联不会在那里工作,所以你仍然有靴子和手套列出。只有没有“蓝色靴子”,没有“蓝色手套”了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值