生成一个从 1 到 12352 的连续数字序列
- SQL server
SQL Server 对递归 CTE 有默认的递归深度限制(默认是 100),当递归次数超过这个限制时会报错。当远超默认限制时,需要在查询前使用 OPTION (MAXRECURSION 0) 来取消递归深度限制。
WITH RECURSIVE num_sequence AS (SELECT 1 AS NUMUNION ALLSELECT NUM + 1 FROM num_sequence WHERE NUM < 12352
)
SELECT * FROM num_sequence
OPTION (MAXRECURSION 0); -- 0 表示无限制
- MySQL
如果 MySQL 版本低于 8.0(不支持 CTE),则需要通过创建临时表的方式生成数字序列来实现相同功能。
MySQL 同样有默认的递归深度限制,通过max_recursion_depth
(8.0.3前) 系统变量控制递归 CTE 的最大迭代次。8.0.3 版本起,用于控制递归 CTE 迭代上限的变量名称是cte_max_recursion_depth
,它的默认数值为 1000 。
查询 递归深度语句SHOW VARIABLES LIKE 'cte_max_recursion_depth;
-- 第一步:临时取消递归深度限制。SET cte_max_recursion_depth = 12352 ;-- 第二步:执行递归 CTE 生成序列
WITH RECURSIVE num_sequence AS (SELECT 1 AS NUM -- 递归起点:生成第一个数字 1UNION ALLSELECT NUM + 1 -- 递归逻辑:每次在上一个数字基础上加 1FROM num_sequence WHERE NUM < 12352 -- 递归终止条件:数字小于 12352 时继续,等于 12352 时停止
)
SELECT * FROM num_sequence;-- 第三步:设回原来的递归深度限制SET cte_max_recursion_depth = 1000;
MySQL 8.0.3 ~ 8.0.16 之间的部分版本,对 cte_max_recursion_depth = 0 的支持存在小 bug,可能误判递归次数。不使用 “无限制(0)”,可直接设置一个 大于或等于目标迭代次数 的值。