时间: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 软件设计 应用程序 文章 数据库操作