Текущий архив: 2003.03.03;
Скачать: CL | DM;
ВнизДерево SQL - удаление дочерних веток Найти похожие ветки
← →
Wizard_Ex (2003-02-09 17:02) [0]Есть таблица
ID - integer, Parent_ID - integer , Name - varChar(15)
1 -1 Альфа
2 1 Бета
3 1 Гамма
4 1 Дельта
5 2 Каппа
6 2 Ламбда
7 5 О Микрон
8 7 Пи
9 2 Ро
Выглядит все это так:
Альфа
Бета
Каппа
О Микрон
Пи
Ламбда
Ро
Гамма
Дельта
Как удалить все дочерние ветви ветки с ID=2 и ее тоже, т.е ветку Бета с дочерними ветками.
← →
Sergey Masloff (2003-02-09 18:23) [1]А в чем проблема? Удали ее и в триггере на удаление удали дочек.
← →
Wizard_Ex (2003-02-10 06:25) [2]Количество дочерних веток может быть любым
В том и проблема
← →
ЮЮ (2003-02-10 06:30) [3]Триггер и сработает столько раз, сколько строк ты попытаешься удалить.
← →
Александр С. (2003-02-10 07:28) [4]Если Parent связан с ID через FK,
то для такой связи можно указать Action
OnDelete - Cascade. И все..
← →
Wizard_Ex (2003-02-10 15:17) [5]ХМ, попробую
это решение мне в голову не приходило
← →
Fiend (2003-02-10 16:54) [6]а вообще можно и лёго выбрать одним запросом
← →
jocko (2003-02-10 18:10) [7]2 Fiend
?
← →
Sergey Masloff (2003-02-10 20:39) [8]>Александр С. © (10.02.03 07:28)
>Если Parent связан с ID через FK,
>то для такой связи можно указать Action
>OnDelete - Cascade. И все..
Это тоже триггер... Только системный ;-)
← →
Wizard_Ex (2003-02-11 06:41) [9]Только тогда проблема возникает при вставке Root ветвей
ID получаем при помощи генератора
А Parent_ID уже должен существовать в таблице
Больше интересно одним запросом и легко:
> Fiend © (10.02.03 16:54)
> а вообще можно и лёго выбрать одним запросом
Это как
Мне лично кажется можно еще и через ХП, но это уже не проще
← →
Fiend (2003-02-11 10:17) [10]упс, на ИБ один запросом не выйдет
могу привесть свою процедуру для MS SQL которая удаляет.
если надо приведу
← →
Александр С. (2003-02-11 10:46) [11]>Wizard_Ex А Parent_ID уже должен существовать в таблице
Для этого можно вставить запись INSERT INTO...
(ID, PARENT)VALUES(0, 0)
и это будет корень, а уже потом вставлять корневые элементы (PARENT = 0)и т.д.
В запросах проверять WHERE ID <> PARENT, что бы не показывать корень.
Если необходимо можно сделать несколько корней
INSERT INTO...(ID, PARENT)VALUES(-100, -100)
INSERT INTO...(ID, PARENT)VALUES(-1000, -1000).
← →
Fiend (2003-02-11 11:11) [12]То Александр С.:
какой изврат! Вах!
← →
Александр С. (2003-02-11 11:30) [13]> Fiend © (11.02.03 11:11)
> какой изврат! Вах!
Изврат в чем?
← →
Fiend (2003-02-11 11:32) [14]зачем несколько корней???
← →
Александр С. (2003-02-11 11:38) [15]Fiend © (11.02.03 11:32)
Было сказано:
> Если необходимо можно сделать несколько корней
, а зачем это нужно? Все зависит от предметной области..
← →
jocko (2003-02-11 14:03) [16]по поводу корней и вообще дерева, повторюсь (вообще этот вопрос недавно поднимался)
так вот, скачем от печки: осн. правило есть объект - есть таблица.
объектов 2:
1. непосредственно сущность которую описываем (например "единицы
измерения": id, название)
2. соотношения между ними (id, parent_id, соответствие)
(пример чисто для наглядности)
достоинство: корней сколько угодно, запись можно вносить сразу не заботясь о родителе, связь устанавливается потом (например из иннтерфейса)
тут шла речь о тригерах - с такой моделью кажется тоже проще, хотя я не любитель тригеров
← →
Wizard_Ex (2003-02-12 07:43) [17]Вопрос по той же теме
можно ли запросом сделать выборку все веток кроме ветки Бета и ее дочерних веток
однако
насчет следующего согласен
> Александр С. © (11.02.03 10:46)
при вставке корня ID и Parent_ID должны быть равны иначе Foreign key не даст вставить запись
← →
Александр С. (2003-02-12 07:55) [18]> можно ли запросом сделать выборку все веток кроме ветки Бета и ее дочерних веток
Просто запросом ИМХО нельзя.
Рекурсия в ХП из которой исключается ветка Бета.
Но при большом количестве записей записей возможны проблеммы.
← →
Кило (2003-02-12 10:04) [19]А как написать в тригере (до удаления) чтобы удалялись дочери?
← →
Александр С. (2003-02-12 12:22) [20]Delete from <TableName> where Parent = Old.ID
Страницы: 1 вся ветка
Текущий архив: 2003.03.03;
Скачать: CL | DM;
Память: 0.48 MB
Время: 0.01 c