嵌套集模型:在子节点末尾插入节点

时间:2010-02-01 14:34:15

标签: sql nested-sets

现有数据(name,lft,rgt):

Root, 1, 4
Item1, 2, 3

看起来像:

- Root
--- Item1

如何在Item1下面插入一个新节点(Item2)?我的系统当前逻辑遵循我在网上找到的大多数示例,但结果是Item2 ABOVE Item1。

- Root
--- Item1
--- Item2

感谢您的帮助。

3 个答案:

答案 0 :(得分:4)

将嵌套集模型视为XML文件,其中lftrgt是起始和结束标记所在的行:

1  <root>
2   <item1>
3   </item1>
4  </root>

要在root中插入新的子标签,您需要将所有后续记录下移:

1  <root>
2   <item1>
3   </item1>
4   <item2>
5   </item2>
6  </root>

因此,您需要计算item2.lftitem2.rgt(相应地为item2.rgt + 1item1.rgt + 2),然后增加所有 lftrgt 所有项,大于item1.rgt

UPDATE  mytable
SET     rgt = rgt + 2
WHERE   rgt > item1.rgt

UPDATE  mytable
SET     lft = lft + 2
WHERE   lft > item1.rgt

答案 1 :(得分:2)

我不认为“正确答案”是正确的,你应该做的是: set item2.lft = root.rgt(4) set item2.rgt = root.rgt + 1(5)

更新mytable SET rgt = rgt + 2 WHERE rgt&gt; = root.rgt root.rgt现在是6;

更新mytable SET lft = lft + 2 在哪里&lt; root.rgt root.lft保持不变(1),但是你有多个根,它们会得到更新。

您无法使用对等条目来确定lft和rgt值。

答案 2 :(得分:1)

Root, 1, 6
Item1, 2, 3
Item2, 4, 5

并使用ORDER BY ItemName,但当然这只适用于一组给定的兄弟姐妹。

有关如何插入,请参阅此处的第5个查询:http://intelligent-enterprise.informationweek.com/001020/celko.jhtml;jsessionid=OOU0L1TIM1IB1QE1GHPSKH4ATMY32JVN

有些人在他们的数字之间存在差距,试图尽量减少必须完成的UPDATE次数。这个性能问题只能部分缓解,并且是嵌套集模型的固有特性。出于这个原因,许多人实现了其他分层模型,如materialized path