MySQL多重删除。是否可以多次删除引用的行?

时间:2011-08-10 21:05:16

标签: mysql foreign-keys cascading-deletes sql-delete

如果我有一个父表和一个子表,是否可以多次删除它们中的行而不需要" ON DELETE CASCADE"约束

在这个例子中:

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`))

我想多删除行,但不要设置" ON DELETE CASCADE"约束即可。此外,我需要使用DELETE子句过滤WHERE命令。这是可能的,还是我必须在多重删除中制作尽可能多的DELETE个?

2 个答案:

答案 0 :(得分:1)

我通过在DELETE命令中指定确切的连接顺序来解决优化器提示的问题:

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

由于优化器提示STRAIGHT_JOIN,MySQL将首先删除b行。

答案 1 :(得分:0)

这是来自mysql文档页面的说明(http://dev.mysql.com/doc/refman/5.0/en/delete.html):

“如果您使用涉及具有外键约束的InnoDB表的多表DELETE语句,则MySQL优化器可能会按照与其父/子关系不同的顺序处理表。在这种情况下,语句失败并回滚。相反,您应该从单个表中删除并依赖InnoDB提供的ON DELETE功能,以便相应地修改其他表。“ < / p>

所以,这意味着你被迫不使用多删除选项!

希望有所帮助..