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 удалялись?
Есть две таблицы - 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;
удалит данные из 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;