consulta recursiva de mysql, implementación de procedimiento almacenado de eliminación recursiva

Escribí sobre la consulta recursiva y la eliminación de oracle y mysql antes, esta vez agregaré una implementación recursiva de mysql.

1. Principio de implementación

(1) Eliminar la tabla temporal

(2) Cree una tabla temporal y vacíela

(3) Utilice una tabla temporal para almacenar la lista de identificación recorrida de forma recursiva

(4) Consultar la lista de id de la tabla temporal

2. Consultar de forma recursiva el código del procedimiento almacenado

Nombre de la función del procedimiento almacenado: 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. Cree una tabla temporal y obtenga los datos en la tabla temporal

Nombre de la función del procedimiento almacenado: 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. Llame al procedimiento almacenado de la consulta

LLAME findMenuidArray ('1');

Resultado (la consulta es una lista de identificadores, que puede facilitar la consulta relacionada y la eliminación recursiva):

0fc126c5e60942229ae50ebbfb60e5fd
41ceae53abc14ab68a77dc527b1c0e5d
4334b8670a9244699d68fe4d80eeb4e9
5d3c6ab1793f4e55816a99ac71e4431b

5. Eliminar de forma recursiva el código de implementación del procedimiento almacenado

Nombre de la función del procedimiento almacenado: 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. Llame al procedimiento almacenado de la consulta

LLAME findMenuidArray ('1');

resultado

actualización 4

 


 

Supongo que te gusta

Origin blog.csdn.net/eguid/article/details/96966071
Recomendado
Clasificación