现有数据(名称,左值,右值):
Root, 1, 4
Item1, 2, 3
看起来像:
- Root
--- Item1
如何在Item1下方插入一个新节点(Item2)? 我的系统当前的逻辑遵循大部分我在网上找到的例子,但结果是Item2在Item1上方。
- Root
--- Item1
--- Item2
感谢您的帮助。
现有数据(名称,左值,右值):
Root, 1, 4
Item1, 2, 3
看起来像:
- Root
--- Item1
- Root
--- Item1
--- Item2
将嵌套集模型视为带有lft
和rgt
的XML文件,其中起始和结束标签所在的行:
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
),然后递增所有大于item1.rgt
的项目的lft
和rgt
。请注意保留所有HTML标签。UPDATE mytable
SET rgt = rgt + 2
WHERE rgt > item1.rgt
UPDATE mytable
SET lft = lft + 2
WHERE lft > item1.rgt
我认为“正确答案”并不正确,你应该这样做: 将 item2.lft 设为 root.rgt (4) 将 item2.rgt 设为 root.rgt + 1 (5)
更新 mytable 表: 当 rgt ≥ root.rgt 时, 设置 rgt = rgt + 2 root.rgt 现在是 6;
更新 mytable 表: 当 lft > root.rgt 时, 设置 lft = lft + 2 root.lft 保持不变(1),但是如果有多个根节点,它们将被更新。
你不能使用同级条目来确定 lft 和 rgt 值。
Root, 1, 6
Item1, 2, 3
Item2, 4, 5
使用ORDER BY ItemName
,但这只适用于给定的一组兄弟。
关于如何插入,请参见此处的第5个查询:http://intelligent-enterprise.informationweek.com/001020/celko.jhtml;jsessionid=OOU0L1TIM1IB1QE1GHPSKH4ATMY32JVN
有些人在数字之间放置间隔,以尝试最小化必须执行的UPDATE
数量。然而,这种性能问题只能部分缓解,并且是嵌套集模型固有的。因此,许多人实现其他分层模型,例如物化路径。
WHERE left > item1.lft
- 不应该使用right值。 - Esoteric Screen Nameitem1.rgt
进行比较,否则它会移动item1
内部的项目(如果有)。 - Quassnoi