关于公共表达式,recursive自引用为啥会触发循环

来源:6-39 【实战】 公共表表达式-1

慕莱坞3268959

2019-11-11

WITH RECURSIVE test AS (
SELECT 1 AS n
UNION ALL
SELECT 1+n FROM test WHERE n < 10
)
SELECT * FROM test ;
老师,我还是不理解为什么自引用能触发循环,如果多次调用了这个表达式本身,不是会产生多个1吗?,还有就是如果在工作中使用公共表表达式不小心漏写了限制条件引发了死循环,会不会导致服务器死机

写回答

1回答

sqlercn

2019-11-12

首先来说在公共表表达式中如果不小心写了死循环是不会引发宕机的,因为数据库本身可能通过max_sp_recursion_depth变量对循环是有最大次数限制的。那么既然知道是对一个表达式的循环,那么在这个表达式中n是一个变量,是会随着嵌套调用而累加的。所以才会出现一开始是n=1 而后就是n=n+1这样的累加效果。 

0
2
sqlercn
回复
慕莱坞3268959
其实这就是一个递归调用,直到递归的条件不成立时就会退出调用。其实你可以把test看做一个表,第一次调用这个表中列n的值是1,下次调用这个表中列n值就是2,每一次都是更新虚拟表test中列的值,调用结束后返回表的最终值。
2019-11-13
共2条回复

零基础入门 详解企业主流数据库MySQL8.0

掌握SQL优化与慢查询优化,具备独当一面的能力

1641 学习 · 485 问题

查看课程