假设有如下模式:
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 数据库中有一个有向图,节点和循环之间可以有多个路径:
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专家.如果有人可以帮助我通过.
我已经递归CTE来获取如下的值.
Child1 - > Parent 1
Parent1 - > Parent 2
Parent2 - > NULL
如果数据填充出错了,那么我将有类似下面的内容,因为CTE可能会进入无限递归循环并产生最大的递归错误.由于数据量很大,我无法手动检查这些不良数据.如果有办法找到它,请告诉我.
Child1 - > Parent 1
Parent1 - > Child1
要么
Child1 - > Parent 1
Parent1 - > Parent2
Parent2 - > Child1