当前位置:Gxlcms > 数据库问题 > 使用mysql 游标,快速删除子节点及其附属节点

使用mysql 游标,快速删除子节点及其附属节点

时间:2021-07-01 10:21:17 帮助过:24人阅读

/* 创建一个获取树节点及其子节点的函数,并以 节点id1, 节点id2 的形式返回 */
DROP PROCEDURE IF EXISTS get_tree_node;
CREATE  PROCEDURE get_tree_node(IN node_id INT, OUT result VARCHAR(2000))
BEGIN      
    DECLARE nodeid INT(50);  
  DECLARE done INT DEFAULT 0;  
     DECLARE cur CURSOR FOR SELECT id FROM treenodes WHERE pid = node_id;
    DECLARE CONTINUE HANDLER FOR NOT found SET done = TRUE;

  # 这一句非常重要, 他可以保证存储过程至少会返回一个根节点id,调用 CONCAT_WS 函数时就不会出错了
  SELECT id INTO result FROM treenodes WHERE id= node_id;

  OPEN cur;
  REPEAT
            FETCH cur INTO nodeid;                     
      # 避免多一条记录
      IF done <> 1 THEN                
        # 调用递归函数获取节点下的子节点
        CALL get_tree_node(nodeid, @temp);            
        # 合并父节点和子节点的id
                SELECT CONCAT_WS(",", result, @temp) INTO result;
            END IF;
    UNTIL done END REPEAT;  
  # 关闭光标
    CLOSE cur;

END;

删除树节点的存储过程是这个样子的

/* 删除一个节点及其附属节点 */
DROP PROCEDURE IF EXISTS delete_tree_node;
CREATE PROCEDURE delete_tree_node(IN node_id int)
BEGIN
    SET  max_sp_recursion_depth = 10;
    CALL get_tree_node(node_id, @result);
    DELETE FROM treenodes WHERE FIND_IN_SET(id, @result);
    DELETE FROM books WHERE FIND_IN_SET(id, @result);
END


使用mysql 游标,快速删除子节点及其附属节点

标签:mysql   软件设计   应用程序   文章   数据库操作   

人气教程排行