phpmyadmin 默认不支持递归 cte,需 mysql 8.0+/mariadb 10.2+、phpmyadmin ≥5.0 且数据库启用递归支持;执行 select version() 和 @@cte_max_recursion_depth 验证,并关闭格式化、避免空行与会话变量混用。

phpMyAdmin 默认不支持递归 CTE(WITH RECURSIVE)——除非你用的是 MySQL 8.0+ 或 MariaDB 10.2+,且 phpMyAdmin 版本 ≥ 5.0,并确认底层数据库实际启用了递归支持。
确认 MySQL / MariaDB 是否真正支持 WITH RECURSIVE
递归 CTE 不是“写了就能跑”,它依赖数据库引擎能力。常见错误是看到 phpMyAdmin 界面没报错就以为能用,结果返回空结果或 ERROR 1064。
- 执行
SELECT VERSION();,确认是MySQL 8.0.1+或MariaDB 10.2.2+ - 检查是否启用:运行
SELECT @@cte_max_recursion_depth;—— 若返回0或极小值(如1),递归会被立即截断 - MariaDB 用户还需确认
sql_mode没有包含NO_ENGINE_SUBSTITUTION类限制(虽不直接禁用 CTE,但可能掩盖报错)
phpMyAdmin 界面中写递归 CTE 的实操要点
即使数据库支持,phpMyAdmin 的 SQL 标签页仍可能因解析器旧、自动格式化或查询缓冲区问题导致失败。
- 关闭「SQL 查询框」右上角的
Format(格式化)开关,避免它把WITH RECURSIVE拆成多行后误判语法 - 确保语句以分号结尾,且**不要**在末尾额外加空行或注释(某些 phpMyAdmin 版本会把换行后内容当新语句解析)
- 若用变量或用户定义变量(如
@level := @level + 1)混搭递归 CTE,会失败 —— 递归 CTE 内部不支持会话变量 - 示例安全写法:
WITH RECURSIVE org AS ( SELECT id, name, manager_id, 1 AS level FROM employees WHERE manager_id IS NULL UNION ALL SELECT e.id, e.name, e.manager_id, o.level + 1 FROM employees e INNER JOIN org o ON e.manager_id = o.id ) SELECT * FROM org ORDER BY level, id;
遇到 ERROR 1226 或查询超时怎么办
这类错误往往不是语法问题,而是递归失控或资源限制触发。
-
ERROR 1226 (42000): User 'xxx' has exceeded the 'max_execution_time' resource→ 在 CTE 外层加LIMIT,或先用SET SESSION max_execution_time = 30000;提升阈值(需有权限) -
ERROR 1226也可能是cte_max_recursion_depth太小,执行SET SESSION cte_max_recursion_depth = 1000;(注意:全局值需 SUPER 权限,会话级一般允许) - 递归未终止?检查
UNION ALL中的 JOIN 条件是否可能产生循环引用(例如 A→B→A),必须靠业务逻辑保证无环,数据库不校验 - phpMyAdmin 的「刷新」按钮会重发整个查询块 —— 如果递归已卡住,别狂点,先关掉标签页再重开
递归深度、JOIN 效率、索引覆盖这三者在 CTE 里是耦合的;EXPLAIN 在递归 CTE 中输出有限,真要调优得先在命令行 MySQL 客户端里验证执行计划。phpMyAdmin 终究是个可视化辅助工具,别指望它显示递归每一轮的中间态。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











