首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Cascade on Delete on嵌套表

Cascade on Delete on嵌套表
EN

Stack Overflow用户
提问于 2013-05-01 10:42:23
回答 1查看 251关注 0票数 0

我有类似这样的表

代码语言:javascript
复制
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);

如果我这样做了

代码语言:javascript
复制
  DELETE FROM A WHERE Z=3

B可以正确更新,而C不能。

如果我这样做了

代码语言:javascript
复制
  DELETE FROM B WHERE Z=3

B可以正确更新,而C不能。

级联上的C正在丢弃与任何东西完全无关的行。事实上,这两个delete命令都不应该到达C语言。

为什么它要用核弹攻击C表?任何一个删除操作都应该删除表B中的(3,3)和(4,3)并停止。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-05-03 01:45:15

问题是,I删除了一些东西,就好像它们是不同的,而不是组合键的一部分。所以我必须在表C中有一些类似于

代码语言:javascript
复制
  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;

然后考虑到它是一个组合键,它可以正确地工作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16312019

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档