Postgres ltree模块,更新具有所有子路径相关路径的节点的id

时间:2018-01-30 04:55:55

标签: sql postgresql ltree

我有以下简单的表格:

create table nodes(
    id text primary key,
    path ltree
);

让我说我把一些数据放到桌子上:

insert into nodes (id, path) values ('A', 'A');
insert into nodes (id, path) values ('B', 'A.B');
insert into nodes (id, path) values ('C', 'A.C');

这样树看起来像:

       A

  /          \

B             C

现在我想将A的ID重命名为X,以便树

       X

  /          \

B             C

,表格看起来像

insert into nodes (id, path) values ('X', 'X');
insert into nodes (id, path) values ('B', 'X.B');
insert into nodes (id, path) values ('C', 'X.C');

有人可以提示吗 - 这可能与单个查询有关吗?

感谢任何帮助,谢谢

1 个答案:

答案 0 :(得分:0)

使用http://patshaughnessy.net/2017/12/14/manipulating-trees-using-sql-and-the-postgres-ltree-extension中的方法,特别是“移动分支”部分:

UPDATE nodes SET id = 'X' WHERE id = 'A';
UPDATE nodes SET path = 'X' || subpath(path, 1) WHERE path <@ 'A';