相关疑难解决方法(0)

在postgres中防止和/或检测周期

假设有如下模式:

CREATE TABLE node (
  id       SERIAL PRIMARY KEY,
  name     VARCHAR,
  parentid INT REFERENCES node(id)
);
Run Code Online (Sandbox Code Playgroud)

此外,我们假设存在以下数据:

INSERT INTO node (name,parentid) VALUES
('A',NULL),
('B',1),
('C',1);
Run Code Online (Sandbox Code Playgroud)

有没有办法防止创建周期?例:

UPDATE node SET parentid = 2 WHERE id = 1;
Run Code Online (Sandbox Code Playgroud)

这将创造一个循环 1->2->1->...

postgresql triggers plpgsql recursive-query

6
推荐指数
1
解决办法
1548
查看次数

在递归查询中检测循环

我的 PostgreSQL 数据库中有一个有向图,节点和循环之间可以有多个路径:

create table "edges" ("from" int, "to" int);
insert into "edges" values (0, 1), (1, 2), (2, 3), (3, 4), (1, 3);
insert into "edges" values (10, 11), (11, 12), (12, 11);
Run Code Online (Sandbox Code Playgroud)

我想找到一个节点和连接到它的每个节点之间的最小边数:

with recursive "nodes" ("node", "depth") as (
  select 0, 0
union
  select "to", "depth" + 1
  from "edges", "nodes"
  where "from" = "node"
) select * from "nodes";
Run Code Online (Sandbox Code Playgroud)

返回所有路径的深度:

 node  0 1 2 3 3 4 4 
 depth 0 1 2 2 3 3 4 …
Run Code Online (Sandbox Code Playgroud)

sql postgresql common-table-expression

5
推荐指数
1
解决办法
2609
查看次数

在CTE中找到无限递归循环

我不是SQL专家.如果有人可以帮助我通过.

我已经递归CTE来获取如下的值.

Child1 - > Parent 1

Parent1 - > Parent 2

Parent2 - > NULL

如果数据填充出错了,那么我将有类似下面的内容,因为CTE可能会进入无限递归循环并产生最大的递归错误.由于数据量很大,我无法手动检查这些不良数据.如果有办法找到它,请告诉我.

Child1 - > Parent 1

Parent1 - > Child1

要么

Child1 - > Parent 1

Parent1 - > Parent2

Parent2 - > Child1

sql recursive-cte

4
推荐指数
4
解决办法
9328
查看次数