SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 01.11.2010 10:42:25

nikolajtesla
Завсегдатай
Зарегистрирован: 12.10.2010
Сообщений: 25

Выбрать все дерево

Добрый день.
Есть таблица с деревом.
CREATE TABLE IF NOT EXISTS `tree` (
  `id` tinyint(3) unsigned NOT NULL AUTO_INCREMENT,
  `pid` tinyint(3) unsigned NOT NULL,
  `name_rus` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `pid` (`pid`)
);

Появился вопрос - можно ли одним запросом выбрать все дерево для определенного pid?
Спасибо большое.

Неактивен

 

#2 01.11.2010 12:45:48

nikolajtesla
Завсегдатай
Зарегистрирован: 12.10.2010
Сообщений: 25

Re: Выбрать все дерево

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

Делаю это так:
ALTER TABLE tree ADD
FOREIGN KEY (pid)
REFERENCES tree(id) ON DELETE CASCADE

На что mysql мне говорит:
#1452 - Cannot add or update a child row

Не подскажете, что я делаю не так?

Неактивен

 

#3 01.11.2010 15:23:34

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Выбрать все дерево

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

На второй вопрос — подумайте, как у Вас помечены корневые строки (без родителя) wink

Неактивен

 

#4 02.11.2010 10:39:16

nikolajtesla
Завсегдатай
Зарегистрирован: 12.10.2010
Сообщений: 25

Re: Выбрать все дерево

Спасибо за ответы, но вот с вторым вопросом я так ничего и не понял.

Неактивен

 

#5 02.11.2010 13:19:24

lyba
Участник
Откуда: Москва
Зарегистрирован: 02.11.2010
Сообщений: 2

Re: Выбрать все дерево

Помогите с вторыи вопросом

Неактивен

 

#6 02.11.2010 15:31:58

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Выбрать все дерево

Хм. Это задание в ВУЗе? smile

Представьте себе, что у Вас есть дерево, которое описывается такими данными:
id  |  parent
-------------
1  | 0
2  | 1
3  | 1
4  | 3

Если Вы хотите ввести ограничение «parent должен обязательно содержать-
ся в этой же таблице в колонке id», то Вы неизбежно нарушите его в случае
со значением 0: у Вас никогда не будет строки, соответствующей корневой
строке дерева (иначе она по определению не будет корневой wink ).

Правильным решением в данном случае будет снять ограничение NOT NULL
со столбца родителя — тогда NULL будет помечать корневые ноды, а связь
будет работать нормально.

Неактивен

 

#7 02.11.2010 16:30:49

nikolajtesla
Завсегдатай
Зарегистрирован: 12.10.2010
Сообщений: 25

Re: Выбрать все дерево

Спасибо огромное за объяснение.
Нет, это никаким образом не связано ни с каким учебным заведением.

Задал повторно вопрос, так как не понимал почему не работает.
Еще раз спасибо

Неактивен

 

Board footer

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