Текущий архив: 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.46 MB
Время: 0.042 c