PHP MySQL删除父行和子行

时间:2013-04-01 16:34:51

标签: mysql parent children sql-delete

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

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

如果我删除item_id 1,我还要删除其余的sub,但我该怎么办呢?

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

我希望有人可以在MySQL中帮助我,也许PHP?

2 个答案:

答案 0 :(得分:5)

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

使用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_id也为1。如果这些“子”行中的任何一行都有自己的孩子,那么它们也会被删除等等(这就是ON DELETE CASCADE的意思)。

答案 1 :(得分: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;