在嵌套表上删除级联

时间:2013-05-01 02:42:23

标签: mysql

我有像

这样的表格
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)并停止。

1 个答案:

答案 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;

然后考虑到它是一个正常工作的复合键。