开发者

MySQL - On delete cascade issue

I have 3 table: A,B and C. Relations are:

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

Table A is the main table:

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 ,
  ........
  P开发者_运维知识库RIMARY 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

I would to delete an entry on table A and I would delete ON CASCADE the entries from B and C.

How can I set my sql scripts to do it?


Hi its similar like following

. I have two tables: article commentary

Commentary has a foreign key to article.id, and of course, when deleting one article, I want all it's comments deleted as well. I've tried to do it as follows:

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
);

This is according to documentation if I am not mistaken (a poster on the MySQL website with short description

This link may also useful to you


You say that tables A and B are in 1:1 relationship but both have auto incrementing key. Instead you have an A._id_B field that I suppose is used to locate the corresponding (1:1) row in table B.

The standard approach would be to drop that A._id_B and in the other table (B), make the primary key not auto incrementing and also make it a FOREIGN KEY to the primary key of A:

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


CREATE TABLE IF NOT EXISTS B 
( _id INT NOT NULL ,
  ........
  PRIMARY KEY (_id) ,                 --- B._id  is a primary key
  CONSTRAINT fk_B_A
    FOREIGN KEY (_id)                 --- and a foreign key
      REFERENCES A (_id)
      ON DELETE CASCADE
      ON UPDATE CASCADE                
 )
ENGINE = InnoDB ;


You would need to introduce a foreign key relationship from B pointing back to A (that is, B needs to include a column with A's id) for this to work. Then set your 'ON DELETE' clause for that relationship to 'ON DELETE CASCADE', and similarly for the fk_C_A constraint on C.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜