MySQL再帰クエリ、再帰削除ストアドプロシージャの実装

以前に再帰クエリとoracleおよびmysqlの削除について書きましたが、今回はmysqlの再帰実装を追加します。

1.実装原理

(1)一時テーブルを削除する

(2)一時テーブルを作成して空にする

(3)一時テーブルを使用して、再帰的にトラバースされるIDリストを格納します

(4)一時テーブルからIDリストをクエリする

2.ストアドプロシージャコードを再帰的にクエリする

ストアドプロシージャ関数名:findMenuChildList(menuPid varchar(32))

BEGIN
  DECLARE v_menu VARCHAR(32);
  DECLARE done INTEGER DEFAULT 0;
    -- 查询结果放入游标中,eguid原创
  DECLARE C_menu CURSOR FOR SELECT d.menuid
                           FROM vnmp_menu d
                           WHERE d.pid = menuPid;
  DECLARE CONTINUE HANDLER FOR NOT found SET done=1;
  SET @@max_sp_recursion_depth = 10;
    
    -- 传入的菜单id写入临时表,eguid原创
 INSERT INTO tmp_menu VALUES (menuPid);
  OPEN C_menu;
  FETCH C_menu INTO v_menu;
  WHILE (done=0)
  DO
        -- 递归调用,查找下级
    CALL findMenuChildList(v_menu);
    FETCH C_menu INTO v_menu;
  END WHILE;
  CLOSE C_menu;
END

3.一時テーブルを作成し、一時テーブルのデータを取得します

ストアドプロシージャ関数名:findMenuidArray(rootIds varchar(32))

BEGIN
    DROP TEMPORARY TABLE IF EXISTS tmp_menu;
    -- 创建临时表,eguid原创
    CREATE TEMPORARY TABLE tmp_menu(menuid VARCHAR(32));
    -- 清空临时表数据
    DELETE FROM tmp_menu;
    WHILE (done=0) 
    DO
        -- 循环调用递归函数,eguid原创
        CALL findMenuChildList(rootId);
    END WHILE;
    -- 删除父节点
    DELETE FROM tmp_menu where menuid=rootId;
    -- 从临时表查询结果
    SELECT menuid FROM tmp_menu;
END

4.クエリストアドプロシージャを呼び出す

CALL findMenuidArray( '1');

結果(クエリは、関連するクエリと再帰的な削除を容易にするIDのリストです):

0fc126c5e60942229ae50ebbfb60e5fd
41ceae53abc14ab68a77dc527b1c0e5d
4334b8670a9244699d68fe4d80eeb4e9
5d3c6ab1793f4e55816a99ac71e4431b

5.ストアドプロシージャ実装コードを再帰的に削除する

ストアドプロシージャ関数名:removeMenuById(rootId varchar(32))

BEGIN
    DROP TEMPORARY TABLE IF EXISTS tmp_menu;
    -- 创建临时表
    CREATE TEMPORARY TABLE tmp_menu(menuid VARCHAR(32));
    -- 清空临时表数据
    DELETE FROM tmp_menu;
    -- 发起调用
    CALL findMenuChildList(rootId);
    -- 不要删除父节点,删除时要同时删除父节点,eguid原创
    #DELETE FROM tmp_menu where menuid=rootId;
    -- 从临时表查询结果,eguid原创
    -- 删除菜单
    DELETE FROM vnmp_menu where menuid in(SELECT menuid FROM tmp_menu);
    -- 删除菜单关联表,如果设置了外键就不需要执行这步,eguid原创
    DELETE FROM vnmp_permission where associatedid in(SELECT menuid FROM tmp_menu);
END

4.クエリストアドプロシージャを呼び出す

CALL findMenuidArray( '1');

結果

アップデート4

 


 

おすすめ

転載: blog.csdn.net/eguid/article/details/96966071