Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 删除数据库中的级联结构_Php_Mysql_Sql - Fatal编程技术网

Php 删除数据库中的级联结构

Php 删除数据库中的级联结构,php,mysql,sql,Php,Mysql,Sql,我有一个DB结构: Products: +---------------------------+ |id|name |details |price|cn| |__|_____|_________|_____|__| | 1|pen |somethi |100 |10| | 2|paper|something|30 |11| +---------------------------+ Categories: +----------------------------+ |id

我有一个DB结构:

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
是“嵌套”的,它引用了它自身的其他列

我试图通过使用级联删除实现以下目标:

当我删除产品时,它也将从
Products2categories
表中删除。(我已经通过将FK与表
products
id
to
products2categories
product\u id
一起使用完成了此操作。 所以这是一个解决了的问题

主要问题如下:

  • 当我删除一个类别时,我想删除它的所有“子”,注意:一个“子”类别可以有另一个“子”在我给出的表格中,
    dad
    granny
    的儿子,
    grands和grands 2
    dad
    的儿子,这意味着,当我删除
    granny
    时,它也会删除
    dad,granson,grandson 2
    。此外,我希望这也能删除所有被删除的产品与这些类别相关
我很确定需要PHP来实现这一点,但我也想知道FK要使用什么,在哪里使用


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

开始时,您只需要另一个引用同一表的外键约束

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
此外,我希望这也能删除所有 与这些类别相关


这可能不是一个好主意。在任何情况下,您都可能需要为此编写触发器,或者在应用程序代码中执行此操作。产品与“Products2类别”处于一对多关系的“一”端。要将“Products2类别”中的删除级联到“Products”,您需要在“Products”中存储“Products2类别”中的键。当然,这是行不通的,因为您可能需要许多这样的键。

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

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
此外,我希望这也能删除所有 与这些类别相关


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

可能的重复可能的重复我完全同意,但不确定你为什么要将
家长id
重命名为
孩子id
。@ypercube:我一次做的事情太多了。总有一天我会停止这样做的。@MikeSherrill'Catcall'嘿!谢谢你的帮助您的解决方案。我对此解决方案有问题,因为我无法将
类别中的
id
字段设置为自动递增,然后插入id为0的行,您能帮我解决吗?此外,您建议如何处理产品?我应该保留它们吗?我应该以某种方式删除它们吗?有It’零并没有什么特别的。使用任何你能使用的数字,或者任何你必须使用的数字。我通常不会仅仅因为产品类别被删除就删除产品。我会说保留它们,除非未分类的产品开始占据数百万行。我完全同意,但不确定你为什么要将
parent\u id
重命名为
child_id
@ypercube:我一次做的事情太多了。总有一天我会停止这样做的。@MikeSherrill'Catcall'嘿!谢谢你的解决方案。我在这个解决方案中遇到了一个问题,因为我无法将
类别中的
id
字段设置为自动递增,然后插入一行ID为0,你能帮我解决这个问题吗?此外,你建议如何处理这些产品?我应该保留它们吗?我应该以某种方式删除它们吗?零并没有什么特别的地方。使用你可以使用的任何数字,或者你必须使用的任何数字。我通常不会仅仅因为产品类别已被删除就删除产品。我会说是ke除非未分类的产品开始占据数百万行,否则不要使用它们。