Общеизвестно, что некоторые операции оказываются простыми для выполнения с помощью Списка соседства, например добавление нового узла-листа:
Файл примера:.Trees/anti/insert.sql
INSERT INTO Comments (bug_id, parent_id, author, comment) VALUES (1234, 7, 'Кукла', 'Спасибо!');
Реализовать перемещение одного узла или поддерева также просто: Фа йл примера:. Trees/'anti/update.sql
UPDATE Comments SET parent_id = 3 WHERE comment_id = 6;
Однако удаление узла из дерева представляет собой более сложную задачу. Если требуется удалить целое поддерево, необходимо сделать несколько запросов, чтобы найти всех потомков. Затем удалить потомков с самого нижнего уровня вверх, чтобы соблюсти требование целостности внешнего ключа.
Файл примера:.Trees/anti/delete-subtree.sql
SELECT comment_id FROM Comments WHERE parent_id = 4; — возвращает 5 и б
SELECT comment_id FROM Comments WHERE parent_id =5; — возвращает «попе»
SELECT comment_id FROM Comments WHERE parent_id = 6; — возвращает 7
SELECT comment_id FROM Comments WHERE parent_id = 7; — возвращает «попе»
DELETE FROM Comments WHERE comment_id IN ( 7 ); DELETE FROM Comments WHERE comment_id IN ( 5, 6 ); DELETE FROM Comments WHERE corranent_id = 4;
Можно использовать внешний ключ с модификатором ON DELETE CASCADE, чтобы автоматизировать эту процедуру, если известно, что требуется постоянно удалять потомков вместо их продвижения или перемещения.
Если вместо этого необходимо удалить узел, не являющийся листом, и продвинуть его дочерние узлы или переместить их в другое место в дереве, сначала потребуется изменить параметр parentid дочерних узлов, а затем удалить требуемый узел.
Файлпримера:. Trees/anti/delete-non-leaf.sql
SELECT parent_id FROM Comments WHERE comment_id =6; — возвращает 4
UPDATE Comments SET parent_id = 4 WHERE parent_id = 6; DELETE FROM Comments WHERE comment_id = 6;
Это примеры операций, выполнение которых осуществляется за несколько шагов при использовании конструкции Списка соседства. Для задач, выполнение которых база данных должна сделать простым и эффективным, приходится писать большие фрагменты кода.
Опубликовал vovan666
June 18 2013 12:24:53 ·
0 Комментариев ·
4265 Прочтений ·
• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •
Комментарии
Нет комментариев.
Добавить комментарий
Рейтинги
Рейтинг доступен только для пользователей.
Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.
Нет данных для оценки.
Гость
Вы не зарегистрированны? Нажмите здесь для регистрации.