MySQL - 关于删除级联问题

时间:2011-10-06 09:45:03

标签: mysql sql sql-delete cascading-deletes

我有3张桌子:A,B和C. 关系是:

  • A-> B 1:1
  • A-> C 1:n

表A是主表:

CREATE TABLE IF NOT EXISTS `A` (
  `_id` INT NOT NULL AUTO_INCREMENT ,
  ..........
  `_id_B` INT NOT NULL ,
  PRIMARY KEY (`_id`) ,
  INDEX `fk_Atable_Btable` (`_id_B` ASC) ,
  CONSTRAINT `fk_A_B`
    FOREIGN KEY (`_id_B` )
    REFERENCES `B` (`_id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
ENGINE = InnoDB

CREATE TABLE IF NOT EXISTS `B` (
  `_id` INT NOT NULL AUTO_INCREMENT ,
  ........
  PRIMARY KEY (`_id`) )
ENGINE = InnoDB

CREATE TABLE IF NOT EXISTS `C` (
  `_id` INT NOT NULL ,
  `_id_A` INT NOT NULL ,
  PRIMARY KEY (`_id`) ,
  INDEX `fk_Ctable_Atable` (`_id_A` ASC) ,
  CONSTRAINT `fk_C_A`
    FOREIGN KEY (`_id_A` )
    REFERENCES `A` (`_id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB

我想删除表A上的条目,我会删除 ON CASCADE 来自B和C的条目。

如何设置我的sql脚本来执行此操作?

3 个答案:

答案 0 :(得分:2)

嗨其类似跟随

。我有两张桌子: 文章 评论

评论有一个article.id的外键,当然,删除一篇文章时,我也希望删除它的所有注释。我试过这样做:

create table article (
id int not null auto_increment,
title varchar(80) not null,
subtitle varchar(80) not null,
content text not null,
author varchar(40) not null,
time datetime not null,

PRIMARY KEY (id)
);

create table commentary (
id int not null auto_increment,
article_id int not null,
title varchar(30),
content tinytext not null,
author varchar(40) not null,
email varchar(50),
ip varchar(16) not null,
time datetime not null,

PRIMARY KEY (id),
FOREIGN KEY (article_id)
    REFERENCES article(id)
    ON DELETE CASCADE
);

如果我没有记错的话,这是根据文件(MySQL网站上的海报 with short description

This link may also useful to you

答案 1 :(得分:0)

你需要引入一个从B指向A的外键关系(也就是说,B需要包含一个带有A id的列)才能使用。然后将该关系的“ON DELETE”子句设置为“ON DELETE CASCADE”,类似地设置C上的fk_C_A约束。

答案 2 :(得分:0)

您说表AB处于1:1关系,但两者都有自动递增键。相反,你有一个A._id_B字段,我想用它来定位表B中相应的(1:1)行。

标准方法是删除A._id_B和另一个表(B),使主键自动递增,并使其成为{{ 1}}到FOREIGN KEY的主键:

A