Em que ordem são processadas as restrições ON DELETE CASCADE?
Aqui está um exemplo do que eu estou acontecendo:
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;
Observe que não há CASO EXCLUSIVO para o relacionamento tio-filho; ou seja, excluir um filho não exclui seu tio e vice-versa.
Quando tenho um pai e um tio com o mesmo filho, e excluo o pai, ele parece como o InnoDB deve ser capaz de "descobrir" e deixar a cascata se espalhar por toda a família (ou seja, excluir o pai exclui o tio e o filho também). No entanto, em vez disso, recebo o seguinte:
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 está tentando excluir em cascata o filho antes do tio que se refere a el
Estou esquecendo de algo? É istosupost falhar por algum motivo eu não entendo? Ou existe algum truque para fazê-lo funcionar (ou é um bug no MySQL)?