您好,登錄后才能下訂單哦!
MYSQL 中怎么利用遞歸查詢解決死循環,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
下面是一個遞歸死循環的例子
這里先解釋一下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 中怎么利用遞歸查詢解決死循環問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。