MySQL « Удаление связанных данных

Доброго времени суток.
Есть две таблицы - menu и menu_elements.
У таблицы menu PRIMARY KEY menu_id, у таблицы menu_elements FOREIGN KEY menu_id.
Запрос на удаление
/** * GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann * (http://qbnz.com/highlighter/ and http://geshi.org/) */ .mysql.geshi_code {font-family:monospace;} .mysql.geshi_code .imp {font-weight: bold; color: red;} .mysql.geshi_code .kw1 {color: #990099; font-weight: bold;} .mysql.geshi_code .kw2 {color: #990099; font-weight: bold;} .mysql.geshi_code .kw3 {color: #9900FF; font-weight: bold;} .mysql.geshi_code .kw4 {color: #999900; font-weight: bold;} .mysql.geshi_code .kw5 {color: #999900; font-weight: bold;} .mysql.geshi_code .kw6 {color: #FF9900; font-weight: bold;} .mysql.geshi_code .kw7 {color: #FF9900; font-weight: bold;} .mysql.geshi_code .kw8 {color: #9900FF; font-weight: bold;} .mysql.geshi_code .kw9 {color: #9900FF; font-weight: bold;} .mysql.geshi_code .kw10 {color: #CC0099; font-weight: bold;} .mysql.geshi_code .kw11 {color: #CC0099; font-weight: bold;} .mysql.geshi_code .kw12 {color: #009900;} .mysql.geshi_code .kw13 {color: #000099;} .mysql.geshi_code .kw14 {color: #000099;} .mysql.geshi_code .kw15 {color: #000099;} .mysql.geshi_code .kw16 {color: #000099;} .mysql.geshi_code .kw17 {color: #000099;} .mysql.geshi_code .kw18 {color: #000099;} .mysql.geshi_code .kw19 {color: #000099;} .mysql.geshi_code .kw20 {color: #000099;} .mysql.geshi_code .kw21 {color: #000099;} .mysql.geshi_code .kw22 {color: #000099;} .mysql.geshi_code .kw23 {color: #000099;} .mysql.geshi_code .kw24 {color: #000099;} .mysql.geshi_code .kw25 {color: #000099;} .mysql.geshi_code .kw26 {color: #000099;} .mysql.geshi_code .kw27 {color: #00CC00;} .mysql.geshi_code .coMULTI {color: #808000; font-style: italic;} .mysql.geshi_code .co1 {color: #808080; font-style: italic;} .mysql.geshi_code .co2 {color: #808080; font-style: italic;} .mysql.geshi_code .es0 {color: #004000; font-weight: bold;} .mysql.geshi_code .es1 {color: #008080; font-weight: bold;} .mysql.geshi_code .br0 {color: #FF00FF;} .mysql.geshi_code .sy1 {color: #CC0099;} .mysql.geshi_code .sy2 {color: #000033;} .mysql.geshi_code .st0 {color: #008000;} .mysql.geshi_code .nu0 {color: #008080;} .mysql.geshi_code span.xtra { display:block; }

DELETE
  menu, menu_elements
FROM
  menu, menu_elements
WHERE
  menu.menu_id = :menu_id
AND
  menu_elements.menu_id = :menu_id
 

В результате если в menu_elements нет связанных записей, из таблицы menu ничего не удаляется.
Как изменить запрос, чтобы записи из menu удалялись?

1 ответов



  DELETE   menu, menu_elements
  FROM  menu
  LEFT JOIN  menu_elements ON (menu.menu_id = menu_elements.menu_id)
  WHERE  menu.menu_id = :menu_id
 

Используй каскадное удаление.


Достаточно для (PRIMARY KEY menu_id и menu_elements FOREIGN KEY menu_id) сделать on delete cascade
и запрос

DELETE FROM `menu` WHERE `menu_id` = menu_id
удалит данные из menu и связанные данные из menu_elements.


CREATE  TABLE IF NOT EXISTS `menu` (
  `menu_id` INT(11) NOT NULL ,
  PRIMARY KEY (`menu_id`) );

CREATE  TABLE IF NOT EXISTS `menu_elements` (
  `menu_elements_id` INT(11) NOT NULL ,
  `menu_id` INT(11) NOT NULL ,
  PRIMARY KEY (`menu_elements_id`) ,
  INDEX `fk_menu_elements_menu1` (`menu_id` ASC) ,
  CONSTRAINT `fk_menu_elements_menu1`
    FOREIGN KEY (`menu_id` )
    REFERENCES `menu` (`menu_id` )
    ON DELETE CASCADE
    ON UPDATE CASCADE);
 

или же 2 запроса на удаление:


DELETE FROM `menu_elements` WHERE `menu_id` = menu_id;
DELETE FROM `menu` WHERE `menu_id` = menu_id;