现有数据(name,lft,rgt):
Root, 1, 4
Item1, 2, 3
看起来像:
- Root
--- Item1
如何在Item1下面插入一个新节点(Item2)?我的系统当前逻辑遵循我在网上找到的大多数示例,但结果是Item2 ABOVE Item1。
- Root
--- Item1
--- Item2
感谢您的帮助。
答案 0 :(得分:4)
将嵌套集模型视为XML
文件,其中lft
和rgt
是起始和结束标记所在的行:
1 <root>
2 <item1>
3 </item1>
4 </root>
要在root
中插入新的子标签,您需要将所有后续记录下移:
1 <root>
2 <item1>
3 </item1>
4 <item2>
5 </item2>
6 </root>
因此,您需要计算item2.lft
和item2.rgt
(相应地为item2.rgt + 1
和item1.rgt + 2
),然后增加所有强> lft
和rgt
所有项,大于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。