5

我有 1 个 MySQL 表。它看起来像这样:

+---------+-------------+--------+
| item_id |  parent_id  |  Name  |
+---------+-------------+--------+
|   1     |     0       |  Home  |
+---------+-------------+--------+
|   2     |     1       |  Sub   |
+---------+-------------+--------+
|   3     |     2       | SubSub |
+---------+-------------+--------+

如果我删除 item_id 1,我也想删除其余的子,但我该怎么做?

我已经尝试过外键,但只有当你有 2 个表时它才有效?

我希望有人可以在 MySQL 或者 PHP 中帮助我?

4

2 回答 2

5

您绝对可以在 MySQL 中使用自引用外键(您不需要多个表)。但是,对于任何类型的外键支持,您都需要使用InnoDB引擎。我的猜测是,您正在使用MyISAM引擎

您可以创建一个类似于您已经拥有InnoDB的表,包括自引用外键,如下所示:

CREATE TABLE  `yourTable` (
  `item_id` int(10) unsigned NOT NULL auto_increment,
  `parent_id` int(10) unsigned default NULL,
  `Name` varchar(50) NOT NULL,
  PRIMARY KEY  (`item_id`),
  KEY `FK_parent_id` (`parent_id`),
  CONSTRAINT `FK_parent_id` FOREIGN KEY (`parent_id`) REFERENCES `yourTable` (`item_id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

然后,当您发布DELETE声明时,例如:

DELETE FROM `yourTable` WHERE `item_id` = 1;

...它会删除每个“子”行,它也有一个parent_id1如果这些“子”行中的任何一个都有自己的子行,它们也会被删除,等等(这就是ON DELETE CASCADE意思)。

于 2013-04-01T16:43:21.680 回答
0

实际上比想象的要容易:

DELETE FROM table WHERE id = # OR parent_id = #; //where # is the same in both places.

例子:

DELETE FROM table WHERE id = 1 OR parent_id = 1;
于 2013-04-01T16:55:53.193 回答