删除DB中的CASCADE结构

时间:2013-08-11 11:36:28

标签: php mysql sql

我有这个数据库结构:

Products:

+---------------------------+
|id|name |details  |price|cn|
|__|_____|_________|_____|__|
| 1|pen  |somethi  |100  |10|
| 2|paper|something|30   |11|
+---------------------------+

Categories:

+----------------------------+
|id | name      |parent_id   |
|____________________________|
|1  | granny    | 0          |
|2  | dad       | 1          |
|3  | grandson  | 2          |
|4  | grandson 2|  2         |
+----------------------------+

Products2categories:

+-------------------------------+
| id  | product_id | category_id|
|_______________________________|
| 1   | 1          | 3          |
| 2   | 1          | 2          |
| 3   | 1          | 1          |
+-------------------------------+

正如您所看到的,表Categories是“嵌套”的,它指的是它自己的其他列。

我尝试使用CASCADE DELETE实现的是:

当我删除某个产品时,它也将从Products2categories表中删除。 (我已经通过使用表格productsidproducts2categoriesproduct_id使用FK来完成此操作。 所以这是一个问题解决了。

主要问题如下:

  • 当我删除一个类别时,我想删除它的所有“儿子”,注意:一个“儿子”类别可以有另一个“儿子”类别,例如在我的表格中已经给出,其中dadgranny的儿子且grandson and grandson2dad的儿子,这意味着,当我删除granny时,它也会删除dad,granson,grandson2 1}}。此外,我希望此处还删除与这些类别相关的产品的所有

我很确定需要PHP才能做到这一点,但我也想知道FK的用途,以及在哪里。

注意:如果您需要 ANY 更多详细信息,请随时提出要求。

1 个答案:

答案 0 :(得分:1)

首先,您只需要引用同一个表的另一个外键约束。

create table Categories (
  row_id integer not null, 
  parent_name varchar(15) not null,
  child_id integer not null,
  primary key (row_id),
  foreign key (child_id) references Categories (row_id) on delete cascade
);

create table Products2Categories (
  product_id integer not null,
  category_id integer not null,
  primary key (product_id, category_id),
  foreign key (category_id) references Categories (row_id) on delete cascade
);

-- Added a "none" row to resolve the foreign key reference for "granny".
insert into Categories values (0, 'none', 0);
insert into Categories values (1, 'granny', 0);
insert into Categories values (2, 'dad', 1);
insert into Categories values (3, 'grandson', 2);
insert into Categories values (4, 'grandson', 2);

insert into Products2Categories values (1, 1);
insert into Products2Categories values (1, 2);
insert into Products2Categories values (1, 3);

delete from Categories where parent_name = 'dad';

select * from Categories;
row_id  parent_name  child_id
--
0       none         0
1       granny       0

select * from Products2Categories;
product_id  category_id
--
1           1
  

此外,我希望这也删除所有产品   与这些类别有关。

这可能不是一个好主意。在任何情况下,您可能都必须为此编写触发器,或者在应用程序代码中执行此操作。产品与“Products2ategories”处于一对多关系的“一”方面。要将“Products2ategories”中的删除级联到“Products”,您需要在“Products”中存储“Products2ategories”中的密钥。当然,这不起作用,因为你可能需要很多这样的密钥。

相关问题