SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 09.05.2008 13:18:31

creator
Участник
Зарегистрирован: 09.05.2008
Сообщений: 2

рекурсивное удаление из таблицы средствами mysql ?

Добрый день... я - web-программист... и по большому счёту в работе с mysql до сего момента использовал простейшие запросы... сейчас я пишу cms для одного из сайтов... грубо говоря меню имеет структуру по аналогии с файловой системой... так вот, таблица с меню представляет из себя следующее:

create table `tab_fs`(
  `num_level` bigint not null,
  `num_menu`  bigint not null,
  `sign`      smallint not null,
  `name`      text not null,
  `id`        bigint not null,
  `pid`       bigint not null
);

к ней же привязана таблица с контентом:

create table `tab_content`(
  `id`        bigint not null,
  `id_text`   text not null,
  .....
);

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

------------------------
1 | 1 | 1 | text | 1 | 1
1 | 2 | 1 | text | 2 | 1
1 | 3 | 0 | text | 3 | 1
------------------------

так вот, если мы добавляем пару подменю... то выглядят данные будут выглядить уже так:

------------------------
1 | 1 | 1 | text | 1 | 1
1 | 2 | 1 | text | 2 | 1
1 | 3 | 0 | text | 3 | 1
------------------------
2 | 1 | 1 | text | 4 | 2
2 | 2 | 0 | text | 5 | 2
2 | 3 | 1 | text | 6 | 2
------------------------
3 | 1 | 1 | text | 7 | 4
3 | 2 | 1 | text | 8 | 4
------------------------

и такой момент, если sign (признак меню, отвечающий за что это собственно есть: конечная ссылка или имеет подменю) равен 0, то в таблицу tab_content добавляется соответствующее содержимое по пункту. т.е. содержимое tab_content будет выглядить так:

--------------
3 | text | ...
5 | text | ...
--------------

так вот... собственно суть вопроса такова: если я делаю удаление раздела, то мне соответственно нужно удалить и все подразделы в него входящие и контент из второй таблицы. Как вы уже заметили, для этого существует два поля id и pid... долбить базу кучей запросов мне естесственно не хочется, а решение на php меня как-то не воодушевляет... вот я подумал что может быть в mysql можно написать один запрос... помогите пожалуйста, если кто знает как.

Неактивен

 

#2 09.05.2008 13:37:25

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: рекурсивное удаление из таблицы средствами mysql ?

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

Если не хочется долбить базу запросами из PHP, то можно написать хранимую процедуру, которая будет получать в качестве аргумента id удаляемой записи и затем уже выполнять запросы. Хранимая процедура хранится в базе. Пример хранимой процедуры есть в соседней теме.

На самом деле в данном случае нет смысла оптимизировать количество запросов - такие операции выполняются редко (по сравнению с просмотром сайта). Важно здесь следить за целостностью, чтобы не было так, что поле sign=0 и есть контент или наоборот поле sign=1 и есть подменю. В вашем описании поле sign вообще говоря избыточное, так как его можно расчитать с помощью JOIN таблицы с контентом. Я бы не завазывал наличие подменю и наличие контента так жестко. Может быть следует допустить у некоторых страниц и контент и подменю.

Неактивен

 

#3 09.05.2008 13:40:14

creator
Участник
Зарегистрирован: 09.05.2008
Сообщений: 2

Re: рекурсивное удаление из таблицы средствами mysql ?

Я бы не завазывал наличие подменю и наличие контента так жестко. Может быть следует допустить у некоторых страниц и контент и подменю.

вполне возможно но не в данном случае (: тут специфика меню такая...

насчёт остального... попробую... спасибо

Отредактированно creator (09.05.2008 13:41:06)

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson