首页/数据/SQL 速查/递归 CTE 的深度限制与环检测

递归 CTE 的深度限制与环检测

数据成环或条件写错时递归不终止:MySQL 有 cte_max_recursion_depth 保护(默认 1000),PostgreSQL 需要自行加深度或路径防护。

SQL 速查数据更新于 2026-10-12

加深度限制(通用)

加深度限制(通用)
WITH RECURSIVE org AS (
    SELECT id, manager_id, 1 AS lvl
    FROM employees
    WHERE manager_id IS NULL
    UNION ALL
    SELECT e.id, e.manager_id, o.lvl + 1
    FROM employees e
    JOIN org o ON e.manager_id = o.id
    WHERE o.lvl < 10          -- 深度上限
)
SELECT * FROM org;

PostgreSQL 14+ 环检测

PostgreSQL 14+ 环检测
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
SELECT * FROM walk;
MySQLcte_max_recursion_depth 默认 1000,超出报 Recursive query aborted
PostgreSQL无默认深度限制;14+ 支持 CYCLE 子句
通用做法递归项加深度上限,定期巡检异常数据

易错点

  • 见到 Recursive query aborted after 1001 iterations 时先查数据是否成环,不要直接调大深度参数
  • 环检测的路径列随深度增长,深层递归加字符串拼接可能占用大量内存

数据来源与参考

  • MySQL 8.0 Reference Manual · Recursive CTE Limits
  • PostgreSQL Documentation · Recursive Queries
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌