Перемещение с дочерними узлами:
В классических вложенных множествах, где все значения 'left' и 'right' находятся в непрерывном блоке значений 0..n * 2, будет диапазон строк, который перемещает либо места 'x' влево, либо «x» ставит справа при перемещении поддерева, где «x» - количество перемещаемых значений влево / вправо. например.
A: 1,6
B: 2,3
C: 4,5
D: 7,8
E: 9,10
Если вы переместили букву «А» с потомками между «D» и «E», то все справа от «А», но слева от «Е», нужно уменьшить его левый / правый индексы на 6 ( размер «А» с потомками):
UPDATE things
SET nsl=nsl+(
IF nsl BETWEEN 1 AND 6 THEN 6 -- A-C go forward 6
ELSE -6 -- D goes back 6
), nsr=nsr+( -- same again
IF nsl BETWEEN 1 AND 6 THEN 6
ELSE -6
)
WHERE
nsl BETWEEN 1 AND 6 -- select A-C
OR nsl BETWEEN 7 AND 8 -- select D
Перемещение без дочерних узлов более сложно. Содержащиеся узлы должны вернуться назад на один, все узлы после удаленного узла должны вернуться назад на два, а затем узлы после новой точки вставки должны двинуться вперед на два, чтобы освободить место.
Хотя вы можете сделать это в том же стиле, что и выше, это начинает сбивать с толку, и вы можете рассмотреть альтернативные подходы, такие как перезапись все значений влево / вправо вручную или с использованием другого типа схемы, которая упрощает эти виды операций, например полное отношение смежности предка и потомка.