我有类似的桌子
CREATE TABLE A (
Z INT NOT NULL AUTO_INCREMENT,
PRIMARY KEY (Z)
) ENGINE=InnoDB;
CREATE TABLE B (
Y INT NOT NULL,
Z INT NOT NULL,
PRIMARY KEY (Y , Z),
FOREIGN KEY (Z)
REFERENCES A (Z)
ON UPDATE CASCADE ON DELETE CASCADE
) ENGINE=InnoDB;
CREATE TABLE C (
Y INT NOT NULL,
Z INT NOT NULL,
PRIMARY KEY (Y , Z),
FOREIGN KEY (Y)
REFERENCES B (Y)
ON UPDATE CASCADE ON DELETE CASCADE,
FOREIGN KEY (Z)
REFERENCES B (Z)
ON UPDATE CASCADE ON DELETE CASCADE
) ENGINE=InnoDB;
INSERT INTO A VALUES (1);
INSERT INTO A VALUES (2);
INSERT INTO A VALUES (3);
INSERT INTO B VALUES (4, 2);
INSERT INTO B VALUES (3, 1);
INSERT INTO B VALUES (3, 3);
INSERT INTO B VALUES (4, 3);
INSERT INTO C VALUES (3, 1);
INSERT INTO C VALUES (4, 2);
如果我做
DELETE FROM A WHERE Z=3
B 正确更新而 C 没有。
如果我做
DELETE FROM B WHERE Z=3
B 正确更新而 C 没有。
级联上的 C 正在删除与任何内容完全无关的行。事实上,这些删除命令都不应该到达 C。
为什么要对 C 表进行核对?任何一个删除都应该删除表 B 中的 (3,3) 和 (4,3) 并停止。