2011-08-10 69 views
1

如果我有一個父表和一個子表,是否有可能在沒有「ON DELETE CASCADE」約束的情況下多刪除它們中的行?MySQL多刪除。是否可以多刪除引用的行?

在這個例子中:

create table a(id int primary key); 
create table b(id int primary key, a_id int, 
constraint fkb foreign key (a_id) references a(id)); 

難道不可能做這樣的事情,以刪除表A和B行? :-(

delete a, b 
from b 
inner join a on a.id = b.a_id 
where a.id = ?; 

Error Code: 1451. Cannot delete or update a parent row: a foreign key constraint fails 
(`erasmusu6`.`b`, CONSTRAINT `fkb` FOREIGN KEY (`a_id`) REFERENCES `a` (`id`)) 

我想multidelete行,但不設置「ON DELETE CASCADE」約束。此外,我需要一個WHERE子句可以過濾DELETE命令。這是可能的,或者我應該有?以使盡可能多的DELETE S作爲在multidelete表

+2

SET foreign_key_checks = 0;並在刪除SET foreign_key_checks = 1後; –

回答

1

我解決優化程序提示的問題,通過在DELETE命令指定確切的連接順序:

delete a, b 
from b 
STRAIGHT_JOIN a on a.id = b.a_id 
where a.id = ?; 

MySQL將DELE TE b行首先感謝優化器提示STRAIGHT_JOIN。

0

這是從MySQL文檔頁面(http://dev.mysql.com/doc/refman/5.0/en/delete.html)注:

「如果你使用一個涉及InnoDB表的多表DELETE語句存在外鍵約束,MySQL優化器可能按照與其父/子關係不同的順序處理表。在這種情況下,語句失敗並回滾。相反,你應該從單一表中刪除,並依靠ON DELETE InnoDB的提供對其它表進行相應的修改功能。」

因此,這意味着你被迫不要使用多刪除選項!

希望幫助..

+1

您可以告訴優化器如何使用STRIGHT_JOIN等提示工作! :-) –