1

我有这个数据库结构:

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表中删除。(我已经通过使用带有表的 FK 来做到这一点......到......products所以idproducts2categoriesproduct_id一个解决的问题。

主要问题如下:

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

我很确定需要 PHP 来做到这一点,但我也想知道使用什么 FK 以及在哪里使用。

注意:如果您需要更多详细信息,请随时询问。

4

1 回答 1

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

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

这可能不是一个好主意。无论如何,您可能必须为此编写触发器,或者在应用程序代码中进行。产品与“Products2Categories”处于一对多关系的“一”端。要将“Products2Categories”中的删除级联“Products”,您需要将“Products2Categories”中的密钥存储在“Products”中。当然,这是行不通的,因为您可能需要很多这样的密钥。

于 2013-08-11T12:22:24.640 回答