Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.09.24;
Скачать: CL | DM;

Вниз

Удалить дочерние разделы (PHP5,MySQL)   Найти похожие ветки 

 
SerJaNT ©   (2006-09-02 14:08) [0]

Вопрос по PHP и MySQL.

Пишу скрипт в котором есть древовидная структура и которая создается динамически.

Есть некая таблица с полями ID и PARENT_ID. В ID хранится уникальный номер (генерируется рандомом). В PARENT_ID хранится ссылка на родителя ну тоже собственно номер родителя. Если категория корневая - то номер будет -1.   Последующие подкатегории имеют ID своего родителя,
т.е. например,
Корневой раздел (ID:888; PARENT_ID:-1)
Подраздел корневого раздела (ID:555;PARENT_ID:888)
Еще один подраздел (ID:777;PARENT_ID:555)
и так далее

Вопрос такой: как при удалении какой-либо категории (корневой или подкатегории) удалить и всех ее потомков т.е. все те категории которые находятся ниже ее ну и принадлежащие общему корневой категории?


 
SerJaNT ©   (2006-09-02 14:11) [1]

Перебирать все записи циклом мне кажется не целесообразно т.к. записей может быть больше 5000 а тут скрипт зависнет и вылетит если время выполнения привысит max_execution_time


 
Styx_   (2006-09-02 14:13) [2]

Возникает вопрос - а каков MySQL? Если не самый древний - использовать таблицы InnoDB и в свойствах FOREIGN KEY поставить ON DELETE CASCADE - и будет счастье...


 
SerJaNT ©   (2006-09-02 14:19) [3]

> Возникает вопрос - а каков MySQL? Если не самый древний
> - использовать таблицы InnoDB и в свойствах FOREIGN KEY
> поставить ON DELETE CASCADE - и будет счастье...


Это конечно все хорошо, но если уже есть база с не InnoDB таблицами, то тогда как?


 
Styx_   (2006-09-02 14:30) [4]

Преобразовать в Innodb?
Одна строчка в SQL или нажатие одной кнопки в phpMyAdmin.
А иначе - считать транзитивное замыкание - ну и работать с ним. Но тоже может быть чревато - хотя при более сложной задаче всё равно придётся :)


 
SergP.   (2006-09-02 15:05) [5]

Уровень вложенности фиксированный или нет?


 
SerJaNT ©   (2006-09-02 15:14) [6]

> Уровень вложенности фиксированный или нет?


нет


 
SergP.   (2006-09-02 15:23) [7]

База вложенные запросы поддерживает?


 
SergP.   (2006-09-02 15:25) [8]

Если версия такая что поддерживает вложенные запросы, то по идее можно было бы удалить сначала нужную категорию/подкатегорию, после чего останется вычистить из таблицы неиспользуемый мусор, т.е. дочерние категории.  
Для этого можно было бы периодически вызывать:

delete from table where parent_id not in (select id from table)
который бы удалял за раз по одному уровню.
Причем если "мусор" тебе не особо не мешает (все равно он пользователям не доступен и просто занимает лишнее место). Его можно было бы даже удалять частями.


 
SerJaNT ©   (2006-09-02 15:26) [9]

MySQL с 4 версии вроде есть



Страницы: 1 вся ветка

Текущий архив: 2006.09.24;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.057 c
3-1153332500
DimDim
2006-07-19 22:08
2006.09.24
Запрос с вычислением


9-1135949556
Ford
2005-12-30 16:32
2006.09.24
Освещенния в Direct3D


15-1157647266
Колдун
2006-09-07 20:41
2006.09.24
Программное управление проигрывателями


2-1157509534
O.O
2006-09-06 06:25
2006.09.24
Приложение на весь экран


2-1157551576
nordic3
2006-09-06 18:06
2006.09.24
Запуск проги по сети