Операция INSERT для вложенного набора для SQLite - PullRequest
3 голосов
/ 30 сентября 2011

Я пытаюсь реализовать модель вложенных множеств для базы данных sqlite.До сих пор я реализовал получение конечных узлов, поиск подчиненных и т. Д. Я использую учебник this в качестве справочного материала. Однако я застрял при вставке нового узла.Вот код с сайта

LOCK TABLE nested_category WRITE;

SELECT @myRight := rgt FROM nested_category
WHERE name = 'TELEVISIONS';

UPDATE nested_category SET rgt = rgt + 2 WHERE rgt > @myRight;
UPDATE nested_category SET lft = lft + 2 WHERE lft > @myRight;

INSERT INTO nested_category(name, lft, rgt) VALUES('GAME CONSOLES', @myRight + 1, @myRight + 2);

UNLOCK TABLES;

Я знаю, что в sqlite нет таблицы блокировок. Моя проблема в том, что мне нужно передать результат первого запроса следующему .Здесь это делается с помощью пользовательской переменной @.Я не мог понять, как это сделать в SQLite.

Заранее спасибо.

1 Ответ

3 голосов
/ 01 января 2012

Идея состоит в том, чтобы заменить переменную myRight запросом, который ее сгенерировал. То есть переместить код в чистый SQL.

UPDATE nested_category SET rgt = rgt + 2 
WHERE rgt > (SELECT rgt 
             FROM nested_category
             WHERE name = 'TELEVISIONS');

UPDATE nested_category SET lft = lft + 2 
WHERE lft > (SELECT rgt 
             FROM nested_category
             WHERE name = 'TELEVISIONS');

INSERT INTO nested_category(name, lft, rgt)
SELECT 'GAME CONSOLES', rgt + 1, rgt + 2 
FROM nested_category
WHERE name = 'TELEVISIONS' ;
...