我有3张桌子:A,B和C. 关系是:
表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脚本来执行此操作?
答案 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
答案 1 :(得分:0)
你需要引入一个从B指向A的外键关系(也就是说,B需要包含一个带有A id的列)才能使用。然后将该关系的“ON DELETE”子句设置为“ON DELETE CASCADE”,类似地设置C上的fk_C_A约束。
答案 2 :(得分:0)
您说表A
和B
处于1:1
关系,但两者都有自动递增键。相反,你有一个A._id_B
字段,我想用它来定位表B
中相应的(1:1)行。
标准方法是删除A._id_B
和另一个表(B
),使主键不自动递增,并使其成为{{ 1}}到FOREIGN KEY
的主键:
A