2013-04-01 71 views
4

我有1个MySQL表。它看起来像这样:PHP MySQL删除父行和子行

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

如果我删除item_id 1,我想删除其余的子也,但我怎么能做到这一点?

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

我希望有人可以帮我在MySQL也许是PHP?

回答

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_id1以及。如果这些“孩子”行中的任何一行有他们自己的孩子,他们也会被删除等等(这就是ON DELETE CASCADE的含义)。

+0

您可以用自做的这个连接在桌子上,而不是创建另一个表。 – Shawn

+0

当我想要插入我的数据时,我得到这个错误:#1452 - 无法添加或更新子行:外键约束失败 – user2180410

+0

@ user2180410使用外键约束时:如果插入的行具有非null的parent_id '值,具有相同值的'item_id'的记录必须事先存在,除非您暂时禁用外键(我会建议不要这样做,因为这会影响他们的目的)。外键约束用于确保数据完整性。 –

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; 
+0

但事情是,这不会'进一步级联'。正如您从OP的示例表中看到的那样,具有'item_id = 2'的记录也有一个自己的子行('item_id = 3'),您的解决方案不会将其删除。如果OP可以,这就足够了,但是OP应该知道你的解决方案会创建孤立记录。 –

+0

为什么我得到了一个有限范围的良好答案的投票?我认为他的意思是,如果ID是1,则删除父母为1的孩子。我不明白他一直想要。 – Shawn

+0

另外一个连接可以解决这个问题。制作第二张表格效率非常低,并不能很好地解决问题。 – Shawn