これが私が行っていることの例です:
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関係にはONDELETECASCADEがないことに注意してください。つまり、子を削除してもその叔父は削除されません。その逆も同様です。
親と同じ子を持つ叔父がいて、親を削除すると、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のバグですか)?