2011-08-20 106 views
1

我有3个表:删除所有记录与JOIN

AAA与列:

id | text 

BBB与列(aaa_id是从上表的外键=>id - AAA):

id | text | aaa_id 

CCC与列(bbb_id是从上表的外键=>id - BBB):

id | text | bbb_id 

现在,当我从桌子AAA删除记录我要删除所有从表BBB这是aaa_id = AAA.id并从表中删除CCC其连接到记录中的所有记录,我想从删除BBB记录(所以他们有bbb_id等于BBB.id的记录是aaa_id等于AAA.id)。

我试过用户内部加入但我没有运气。同时,我用PHP选择所有记录并分别删除它们。

这些表是MyISAM。

回答

2
DELETE AAA, BBB, CCC 
    FROM AAA 
    LEFT JOIN BBB ON BBB.aaa_id = AAA.id 
    LEFT JOIN CCC ON CCC.bbb_id = BBB.id 

如果每个表中总是存在子记录,那么也可以使用INNER JOIN。或者你可以在外键约束中设置ON DELETE CASCADE。为ON

1

您正在寻找ON DELETE CASCADE选项。

CASCADE:删除或更新父表中的行,并自动删除或更新子表中的匹配行。支持ON DELETE CASCADE和ON UPDATE CASCADE。在两个表之间,不要定义几个ON UPDATE CASCADE子句,这些子句在父表或子表中的同一列上起作用。

1

创建的外键与on delete cascade这样当你从父表中的所有子行都会被删除

删除
0

外键约束,DELETE CASCADE

当u创建类似于下面的示例表如下语法,

CREATE TABLE `table2` (
`id` int(11) NOT NULL auto_increment, 
`name` int(11) NOT NULL, 
PRIMARY KEY (`id`), 
KEY `ids` (`ids`) 
CONSTRAINT `foreign` FOREIGN KEY (`ids`) 
REFERENCES `table2` (`ids`) ON DELETE CASCADE ON UPDATE CASCADE 
) 

注:你需要使用InnoDB存储引擎,他默认的MyISAM存储引擎不支持外键关系。

否则使用内部连接进行删除