Главная страница
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.048 c
15-1157346922
Ega23
2006-09-04 09:15
2006.09.24
С Днём рождения! 4 сентября


9-1133562554
Proger
2005-12-03 01:29
2006.09.24
Воксели в играх...?


15-1157452753
rerfhtre
2006-09-05 14:39
2006.09.24
tcpdump: dmp files


2-1157620743
fly_mer
2006-09-07 13:19
2006.09.24
Тип TRecord и его копирование...


2-1157546664
term1t
2006-09-06 16:44
2006.09.24
FastReport 2,4