介紹
MySQL 作為主流關系型數據庫,為了應用方便,其對遞歸查詢提供了多種方式支持。其中較為常見的方式是使用遞歸公用表表達式(Recursive Common Table Expression)
基本語法
遞歸查詢需要用到 with recursive,一般形式如下:
with recursive [遞歸公用表表達式名稱] [列名列表] as (select [初始查詢語句] union all select [遞歸查詢語句]) select [輸出列名列表] from [遞歸公用表表達式名稱];
其中的 select 語句可以嵌套使用,以實現類似于樹的遍歷功能,從而完成對無限極下級的查詢。
示例
例如我們需要查詢某個分類的所有下級,可以使用以下語句:
with recursive category_tree as ( select id, name, parent_id from category where id=1 union all select c.id, c.name, c.parent_id from category_tree ct join category c on ct.id=c.parent_id ) select * from category_tree;
在這里我們以 id=1 的分類為例,使用 union all 吸收所有下級分類,最后通過 select * 來查詢所有相關數據。
遞歸深度限制
為了避免無休止的遞歸查詢可能導致的內存消耗、性能下降等問題,MySQL 8.0.1 版本開始支持遞歸深度限制。該特性默認開啟,可以通過設置遞歸查詢最大深度(Recursive Query Max Depth)調整。設置方法如下:
SET @@cte_max_recursion_depth=n;
其中 n 表示可遞歸的最大深度,如果遞歸深度大于該值,將會拋出錯誤。