FK CASCADE DELETE или триггеры
22 декабря 2010 г. 14:14 пользователь Tonal <[email protected]> написал: > Продолжаем тему деревов. :) > > Как правильно удалять деревья и поддеревья? > > Предположим есть табличка: > create table NODES ( > ID integer not null, > PARENT_ID integer, > TITLE varchar(254) not null, > MODIFY tymestamp not null, > ORD_NUM integer not null, > > constraint PK_NODES primary key (ID), > constraint FK_NODES foreign key (PARENT_ID) references NODES (ID), > ); > Одновременно в таблице может находится несколько деревьев. > Как удалять ветку начиная с указанного ID или вовсе очистить всю таблицу? > > Если выдать для удаления всего просто > delete from NODES > Он обламается на попытке удаления первого же родителя ещё имеющего детей. > > Чуть более сложный запрос удалит только листы: > delete from NODES a > where not exists (select b.ID from NODES b where b.PARENT_ID = a.ID) > И его придётся запускать непонятно сколько раз (не больше максимального > уровня)... > > Для удаления листов ветки получается что-то такое: > delete from NODES a > where not exists (select b.ID from NODES b where b.PARENT_ID = a.ID) > and (a.ID = :ID or a.ID in ( > with recursive TREE as ( > select n.ID, n.PARENT_ID > from NODES n > where n.PARENT_ID = :ID > union all > select n.ID, n.PARENT_ID > from NODES n > inner join TREE t on t.ID = n.PARENT_ID > ) > select t.ID > from TREE t > ) > > Можно ли решить задачку без помощи процедур или EXECUTE BLOCK? > -- > Александр Замараев > > -- -- Norritt, mailto:[email protected]

