Вот пример того, что у меня происходит:
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;
Обратите внимание, что для отношений дядя-ребенок нет ON DELETE CASCADE; удаление ребенка не приводит к удалению его дяди (и), и наоборот.
Когда у меня есть Родитель и Дядя с одним и тем же Ребенком, и я удаляю Родителя, кажется , как будто 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 пытается каскадно удалить ребенка перед дядей (ями), которые ссылаются на него.
Я что-то упустил? Это предполагается потерпеть неудачу по какой-то причине, которую я не понимаю? Или есть какой-то трюк, чтобы заставить его работать (или это ошибка в MySQL)?