扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
MySQL 中怎么利用递归查询解决死循环,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
创新互联致力于互联网网站建设与网站营销,提供成都网站设计、网站制作、网站开发、seo优化、网站排名、互联网营销、成都小程序开发、公众号商城、等建站开发,创新互联网站建设策划专家,为不同类型的客户提供良好的互联网应用定制解决方案,帮助客户在新的全球化互联网环境中保持优势。
下面是一个递归死循环的例子
这里先解释一下CTE 递归
1 递归查询至少包含两个子查询, 第一个查询的目的是设置递归的初始值
2 第二个查询成为递归查询,第二个查询调用第一个查询的结果,然后开始循环
之间通过union all 来连接.
递归查询中,当查询的结果不匹配,或超过了递归次数就会停止. 或者在执行是系统发现是死循环则会在设定好的最大cte_max_recursion_depth 后终止查询.
递归查询中出现3636的问题,分为两种
1 数据出现问题 (这是引起递归出现问题的常见原因)
2 SQL 递归的撰写有问题
根据1 出现问题的概率比较大,并且比较难以排查, 这里就需要在写SQL 的时候,添加一些语句来避免递归出现问题.
1 方法一, 使用distinct ,通过在union 后面添加distinct 来将重复的数据去掉,大部分死循环是因为有重复的数据,这样可以查出数据. 但问题是在 WORKBENCH 中是可以的,但将语句在 MYSQL 程序中是报错的,这点我也没法解释.
2 方法 在MYSQL 8.109 引入了 LIMIT 语句,通过LIMIT 来限制输出数据的数量,投机取巧的避免了部分 3636 的错误
这个方式在workbench 和 MYSQL 命令符下都是OK 的.
实际当中,可能用的最多的是另外一种方式,自动设置让死循环结束
WITH RECURSIVE cte_all AS
(
SELECT dname AS Child
FROM cte_test
WHERE rname='Tim'
UNION all
SELECT r.dname
FROM cte_test r, cte_all d
WHERE r.rname=d.Child
)
SELECT /*+ MAX_EXECUTION_TIME(1000) */ * FROM cte_all;
这样的写法在workbench 是OK 的,但在MYSQL 命令行中是还是不可以
当然绕来绕去,最关键的还是修复导致死循环的数据
在修复数据后,在此执行查询,问题解决.
关于MYSQL 中怎么利用递归查询解决死循环问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注创新互联行业资讯频道了解更多相关知识。
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流