0

我有一个大约 1500 行的 postgresql 表,模型是基于 Left 和 Right 字段的“Modified Preorder Tree Traversal”结构。我想在其间插入许多行,但我不确定在插入行间时如何计算多行的 level、rightindex 和 leftindex 列值。

数据

我相信对于单行我们可以通过下面的代码来实现这一点,

SELECT @myRight := rgt FROM tablename

UPDATE tablename SET rgt = rgt + 2 WHERE rgt > @myRight;

UPDATE tablename SET lft = lft + 2 WHERE lft > @myRight;


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

但是我们如何才能为大表的多次更新做到这一点。

如果我需要任何进一步的信息,请告诉我。

4

1 回答 1

0

NewNodes将表中的新项目添加到tablename

设置

select * into tablename 
from(
  values
  ('gadgets',1,4, 1),
  ('games', 2,3, 2)
)t(name, lft, rgt, level);


select * into newNodes
from(
  values
  ('console'),
  ('cartridge')
)t(name);

该过程在同级具有指定名称的节点之后添加新节点。

create procedure addNodesFromNewNodes(posname varchar(10))
LANGUAGE plpgsql
as $$
declare
  pos int; lvl int;
  N int;
begin
  select rgt, level  into pos, lvl
  FROM tablename
  WHERE Name = posname;
  
  select count(*) into N
  from newNodes;
  
  update tablename 
  set lft = lft + 2*N
  where lft > pos;
  update tablename 
  set rgt = rgt + 2*N
  where rgt > pos;
  
  insert into tablename(name, lft, rgt, level)
  select t.Name, pos + 2 * rn - 1, pos + 2 * rn, lvl
  from (
     select Name, row_number() over(order by name) rn
     from NewNodes
  ) t;
end;
$$

db<>小提琴

于 2022-01-31T13:32:50.473 回答