MySQL - касательно удаления каскада - PullRequest
0 голосов
/ 06 октября 2011

У меня есть 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 ]

2 голосов
/ 06 октября 2011

Привет это похоже, как следующий

. У меня есть две таблицы: статья комментарии

Комментарий имеет внешний ключ к 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 с кратким описанием

Эта ссылка также может быть полезна для вас

0 голосов
/ 06 октября 2011

Вы говорите, что таблицы A и B находятся в 1:1 отношении, но обе имеют ключ автоматического увеличения.Вместо этого у вас есть поле A._id_B, которое, как я полагаю, используется для поиска соответствующей (1: 1) строки в таблице B.

Стандартным подходом было бы сбросить это A._id_B и в другой таблице (B) сделать первичный ключ , а не с автоматическим приращением, а также сделать его FOREIGN KEY дляпервичный ключ 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 ;
0 голосов
/ 06 октября 2011

Вам необходимо ввести отношение внешнего ключа от B, указывающего назад на A (то есть B должно включать столбец с идентификатором A), чтобы это работало.Затем установите в предложении ON DELETE для этого отношения значение ON DELETE CASCADE и аналогично для ограничения fk_C_A для C.

...