使用mysql 游标,快速删除子节点及其附属节点
发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,上篇,我写了如何使用html展示数据库中存储的树形结构, 本篇我将说一下如何通过存储过程,快速删除一个树节点及其附属节点。网上已经有非常多的关于mysql 游标使用的文章了, 为什么我还要写这篇文章呢
千家信息网最后更新 2026年11月02日使用mysql 游标,快速删除子节点及其附属节点
上篇,我写了如何使用html展示数据库中存储的树形结构, 本篇我将说一下如何通过存储过程,快速删除一个树节点及其附属节点。网上已经有非常多的关于mysql 游标使用的文章了, 为什么我还要写这篇文章呢,我主要是想表达一些在软件设计领域的一些想法。
一直不太赞同在数据库中大量的使用存储过程, 因为随着软件系统的复杂度逐渐提高,维护的难度会逐渐的增大。而且大批量的使用存储过程,不利于后期通过分布式部署应用程序来解决日益增多的业务需求。
我推荐把存储过程仅用在处理一些不包含太多业务,批量操作数据的场景中,因为这样可以避免应用程序频繁的访问数据库。删除一个树的子节点正好符合这一场景。
我们知道删除一个树节点的同时,需要删除其子节点或叶子节点。通过使用mysql的游标,我们可以遍历某一节点的所有子节点,通过使用递归,我们可以跨越多层直至叶子节点。
要实现删除一个树节点, 一个存储过程肯定可以搞定,但是为了让程序逻辑更简单些, 我写了两个存储过程,一个用来获取存储过程所有符合条件的节点,另一个用来执行删除操作。
遍历节点,找出符合节点及其所有的子节点的实现是这样的。
/* 创建一个获取树节点及其子节点的函数,并以 节点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
这里注意 max_sp_recursion_depth 这个msyql 参数 和 FIND_IN_SET 函数。
max_sp_recursion_depth 控制可以执行递归的层数,
FIND_IN_SET 函数的作用,会将@result 先变为一个字符串列表,再查找复合条件的值。这里若用 IN 关键字的话,将得不到任何结果
节点
存储
过程
函数
数据
数据库
程序
递归
游标
附属
业务
叶子
场景
应用程序
条件
软件
应用
复杂
重要
频繁
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
疫情对互联网科技公司影响
互联网扶贫科技
互联网科技战争
腾讯阿里互联网科技
科技类互联网
互联网科技与金融科技
互联网科技金融
深圳互联网科技公司
互联网科技公司有哪些
上海卓越科技 互联网
联恩商钥互联网科技有限公司
互联网5g黑科技有哪些
想开互联网科技公司怎么样
佛山市拉法互联网科技有限公司
伊宁互联网科技做什么的
中天科技中国工业互联网
互联网营销推广黑科技
厦门江牛科技互联网
西安有哪些互联网高科技企业
互联网企业和网络科技有限公司
咖啡
互联网科技股
互联网最新的科技
北京互联网科技公司
滨湖区互联网智能科技产品供应
河南住房之家互联网科技
元气玛特互联网科技公司是外包吗
深圳互联网科技的发展
江苏互联网智能科技产品出厂价
杭州融税互联网科技有限公司