如果我有一个父表和一个子表,是否可以多次删除它们中的行而不需要" 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
个?
答案 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>
所以,这意味着你被迫不使用多删除选项!
希望有所帮助..