تشخیص حلقه توی گراف: بند CYCLE
یه حلقه توی دادهها (A والد B، B والد A) باعث میشه CTE بازگشتی بیپایان بچرخه. بند CYCLE (توی PostgreSQL 14 به بعد) بازگشت رو متوقف میکنه و ردیفهای مشکلدار رو علامت میزنه.
کاربرد
بررسی یکپارچگی یه سلسلهمراتب قبل از مهاجرت؛ جلوگیری از بازگشت بینهایت.
پیشنیازها
PostgreSQL 14+ (avant : accumuler un ARRAY des ids visités)
SQL
WITH RECURSIVE walk AS (
SELECT id, parent_id
FROM nodes
WHERE parent_id IS NULL
UNION ALL
SELECT n.id, n.parent_id
FROM nodes n
JOIN walk w ON n.parent_id = w.id
) CYCLE id SET is_cycle USING path -- PostgreSQL 14+
SELECT id, path
FROM walk
WHERE is_cycle; -- lignes impliquées dans une boucleنتیجه
id | path
-----+-------------------------
88 | {(17),(88),(204),(88)}
204 | {(17),(88),(204),(88),(204)}
(2 rows) -- 88 -> 204 -> 88 : boucle à corriger avant migrationSQLRécursifCYCLEIntégrité