我有像
这样的表格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)并停止。
答案 0 :(得分:1)
问题在于我正在删除事物,就好像它们是截然不同的,而不是复合键的一部分。所以我必须在表C中有一些
的内容 CREATE TABLE C (
Y INT NOT NULL,
Z INT NOT NULL,
PRIMARY KEY (Y , Z),
FOREIGN KEY (Y , Z)
REFERENCES B (Y , Z)
ON UPDATE CASCADE ON DELETE CASCADE
) ENGINE=InnoDB;
然后考虑到它是一个正常工作的复合键。