这是我正在做的一个例子:
CREATE TABLE Parent (id BIGINT NOT NULL,
PRIMARY KEY (id)) ENGINE=InnoDB;
CREATE TABLE Child (id BIGINT NOT NULL,
parentid BIGINT NOT NULL,
PRIMARY KEY (id),
KEY (parentid),
CONSTRAINT fk_parent FOREIGN KEY (parentid) REFERENCES Parent (id) ON DELETE CASCADE) ENGINE=InnoDB;
CREATE TABLE Uncle (id BIGINT NOT NULL,
parentid BIGINT NOT NULL,
childid BIGINT NOT NULL,
PRIMARY KEY (id),
KEY (parentid),
KEY (childid),
CONSTRAINT fk_parent_u FOREIGN KEY (parentid) REFERENCES Parent (id) ON DELETE CASCADE,
CONSTRAINT fk_child FOREIGN KEY (childid) REFERENCES Child (id)) ENGINE=InnoDB;
请注意,Uncle-Child 关系没有 ON DELETE CASCADE;即删除 Child 不会删除其 Uncle,反之亦然。
当我有同一个孩子的父母和叔叔时,我删除了父母,似乎InnoDB 应该能够“弄清楚”并让级联在整个家庭中涟漪(即删除父母删除叔叔和孩子也是如此)。但是,相反,我得到以下信息:
ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`cascade_test/uncle`, CONSTRAINT `fk_child` FOREIGN KEY (`childid`) REFERENCES `child` (`id`))
InnoDB 正在尝试在引用它的 Uncle 之前级联删除 Child。
我错过了什么吗?这是否应该由于某种我不明白的原因而失败?或者是否有一些技巧可以让它工作(或者它是 MySQL 中的一个错误)?