MySQL-删除级联上的外键-是否定义了执行顺序?

MySQL-删除级联上的外键-是否定义了执行顺序?,mysql,Mysql,我对MySQL-CASCADE在多个表上的删除规则有一个问题。显然,“删除时级联”规则的执行顺序取决于它们的定义顺序 但是这个执行顺序定义得很好还是取决于MySQL版本? 下面是我对三个表“A”、“B”、“C”的简单示例 如果我插入以下数据: INSERT INTO A (id) VALUES (1); INSERT INTO B (id, a_id) VALUES (1,1); INSERT INTO C (id, a_id, b_id) VALUES (1,1,1); …并尝试删除表“A”

我对MySQL-CASCADE在多个表上的删除规则有一个问题。显然,“删除时级联”规则的执行顺序取决于它们的定义顺序

但是这个执行顺序定义得很好还是取决于MySQL版本?

下面是我对三个表“A”、“B”、“C”的简单示例

如果我插入以下数据:

INSERT INTO A (id) VALUES (1);
INSERT INTO B (id, a_id) VALUES (1,1);
INSERT INTO C (id, a_id, b_id) VALUES (1,1,1);
…并尝试删除表“A”中的唯一条目:

…我收到以下错误消息:

Cannot delete or update a parent row: a foreign key constraint fails (`C`, CONSTRAINT `C2` FOREIGN KEY (`b_id`) REFERENCES `B` (`id`))
但如果我将外键约束的定义更改为:

ALTER TABLE `C` ADD CONSTRAINT `C1` FOREIGN KEY (`a_id`) REFERENCES `A` (`id`) ON DELETE CASCADE;
ALTER TABLE `C` ADD CONSTRAINT `C2` FOREIGN KEY (`b_id`) REFERENCES `B` (`id`);
ALTER TABLE `B` ADD CONSTRAINT `B1` FOREIGN KEY (`a_id`) REFERENCES `A` (`id`) ON DELETE CASCADE;
…一切都很好


感谢您的帮助

您的
ALTER TABLE TABLE ADD CONSTRAINT foreign\u key foreign key
是相同的,因此它们不能成为错误的原因

(…文本已删除)


无法解释这种奇怪的行为。可以建议一种解决方法:

SET FOREIGN_KEY_CHECKS = 0;
DELETE FROM A WHERE ID=1;
SET FOREIGN_KEY_CHECKS = 1;

嘿这是真的。。!谁能告诉我这背后的原因是什么。。。??我在这里尝试了sqlfiddle登陆,也遇到了同样的问题,但这种顺序行为似乎有所改变:在mysql 5.7.21上,两次尝试(在C2之后设置B1或在B1之后设置C2)都会导致
无法删除
,因此如果定义了FK分辨率的顺序,然后它同时改变了…但是如果改变外键语句的顺序,它就可以正常工作了。我明确地不希望在表“C”和表“B”之间存在ON-DELETE级联约束。上述约束定义之间的唯一区别是它们的顺序。顺序:表C的定义,表B的定义,表C的定义不起作用,顺序:表C的定义,表C的定义,表B的定义起作用…是的。这是非常奇怪的行为。我无法想象。我会在bugs.mysql.com上写一个请求。
ALTER TABLE `C` ADD CONSTRAINT `C1` FOREIGN KEY (`a_id`) REFERENCES `A` (`id`) ON DELETE CASCADE;
ALTER TABLE `C` ADD CONSTRAINT `C2` FOREIGN KEY (`b_id`) REFERENCES `B` (`id`);
ALTER TABLE `B` ADD CONSTRAINT `B1` FOREIGN KEY (`a_id`) REFERENCES `A` (`id`) ON DELETE CASCADE;
SET FOREIGN_KEY_CHECKS = 0;
DELETE FROM A WHERE ID=1;
SET FOREIGN_KEY_CHECKS = 1;