2015-10-03 5 views
0

Мне интересно, как реализована функция ON CASCADE DELETE, потому что я хотел бы иметь некоторое представление о производительности этой операции.
Предположим, у меня есть 3 таблицы: родительский, дочерний (FK, ссылающийся на родителя, включен DELETE CASCADE), внук (FK, ссылающийся на ребенка, включен DELETE CASCADE).
Теперь я хочу удалить строку в родительской таблице, а также все соответствующие записи в таблицах для детей и внуков.
Я хотел бы знать, какие запросы «построены» ON DELETE CASCADE для выполнения этой операции.
Это что-то вроде следующего?ON CASCADE DELETE реализация

SELECT child.id FROM child WHERE child.parent_id = 'parent_id'; Затем для каждого возвращаемого результата из запроса SELECT выполняется следующий запрос: DELETE FROM grandchild WHERE grandchild.child_id = 'child_id'? Затем строка в дочерней таблице с id = child_id может быть удалена. Это повторяется до тех пор, пока все дети, возвращаемые запросом SELECT, не будут удалены. Наконец, родитель может быть удален.
Я предполагаю, что он также может быть реализован с использованием некоторого объединения в таблицах, но тогда ограничения внешнего ключа могут потерпеть неудачу.

ответ

0

Да, это то же самое на вашем примере. Для получения дополнительной информации о ваших запросах. Вы можете сделать что-то вроде этого EXPLAIN DELETE FROM table1 where id = 1; , чтобы показать, что произойдет.

Как вы видите на команде explain, я также вызываю индексы при удалении дочерних записей.

+0

Спасибо за ваш ответ! Так что, с точки зрения производительности, он должен быть таким же, как я описал? Не могли бы вы привести сюда ссылку на какой-нибудь документ, ..., который подтвердит ваш ответ? Тогда я немедленно приму ваш ответ. – FilipR

Смежные вопросы