SQL

تشخیص حلقه توی گراف: بند 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 migration
SQLRécursifCYCLEIntégrité

اسنیپت‌های مرتبط

بازگشت به آزمایشگاه داده