/* 创建一个获取树节点及其子节点的函数,并以 节点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 软件设计 应用程序 文章 数据库操作
本条技术文章来源于互联网,如果无意侵犯您的权益请点击此处反馈版权投诉
本文系统来源:http://adadream.blog.51cto.com/233423/1932859