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