MySQL Multi-Delete. Можно ли удалить несколько строк, на которые есть ссылки? - PullRequest
1 голос
/ 11 августа 2011

Если у меня есть родительская таблица и дочерняя таблица, возможно ли многократное удаление строк в них без ограничения «ON DELETE CASCADE»?

В этом примере:

create table a(id int primary key);
create table b(id int primary key, a_id int,
 constraint fkb foreign key (a_id) references a(id));

Разве нельзя сделать что-то подобное для удаления строк в таблицах a и b? : - (

delete a, b
from b
inner join a on a.id = b.a_id
where a.id = ?;

Error Code: 1451. Cannot delete or update a parent row: a foreign key constraint fails
(`erasmusu6`.`b`, CONSTRAINT `fkb` FOREIGN KEY (`a_id`) REFERENCES `a` (`id`))

Я хотел бы многократно удалять строки, но не устанавливать ограничение "ON DELETE CASCADE" . Также мне нужно отфильтровать команду DELETE с предложением WHERE. Возможно ли это, или мне нужно сделать столько DELETE с таблиц в мультидетеле?

Ответы [ 2 ]

1 голос
/ 12 августа 2011

Я решаю проблему с подсказками оптимизатора, указав точный порядок соединения в команде DELETE:

delete a, b
from b
STRAIGHT_JOIN a on a.id = b.a_id
where a.id = ?;

MySQL удалит b строк первым благодаря подсказке оптимизатора STRAIGHT_JOIN.

0 голосов
/ 11 августа 2011

Это примечание со страницы документации mysql (http://dev.mysql.com/doc/refman/5.0/en/delete.html):

"Если вы используете оператор DELETE с несколькими таблицами, включающий таблицы InnoDB, для которых есть ограничения внешнего ключа, MySQLОптимизатор может обрабатывать таблицы в порядке, отличающемся от их родительских / дочерних отношений. В этом случае инструкция не выполняется и выполняется откат. Вместо этого следует удалить из одной таблицы и полагаться на возможности ON DELETE, которые InnoDB предоставляет для вызовадругие таблицы должны быть изменены соответствующим образом. "

Таким образом, это означает, что вы вынуждены не использовать опцию множественного удаления!

Надеюсь, это поможет ..

...