0

我有类似的桌子

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) 并停止。

4

1 回答 1

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;

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

于 2013-05-02T17:45:14.967 回答