使用mysql 游标,快速删除子节点及其附属节点
发表于:2025-11-08 作者:千家信息网编辑
千家信息网最后更新 2025年11月08日,上篇,我写了如何使用html展示数据库中存储的树形结构, 本篇我将说一下如何通过存储过程,快速删除一个树节点及其附属节点。网上已经有非常多的关于mysql 游标使用的文章了, 为什么我还要写这篇文章呢
千家信息网最后更新 2025年11月08日使用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安全错误
数据库的锁怎样保障安全
对数据库进行索引的目的是
虚拟主机云服务器ip
安全分析大数据库
数据库大作业超市管理系统
柳州市网络安全教育网
2020年网络安全培训考试
服务器复制文件一直正在计算
怎么掌握5g网络技术
仓库管理系统数据库的英文
西奥电梯软件开发工程师薪资
1 计算机网络安全是指
软件开发 ba
网络安全软考2018
苹果的服务器在贵州安全吗
网络安全黑板报讲解
阿里巴巴网络安全部门是谁
河源自主可控软件开发
青浦网络安全攻防
数据库查询right
企业在线销售系统数据库课设
国家网络安全认证培训证书
无线传感器网络技术通信距离
海康本地管理服务器
根服务器攻击
杭州百卓网络技术有限公司
求生之路2服务器怎么关
网络安全词语四字
镇江互联网科技有限公司
如何爬取数据库
腾讯云数据库mysql80正式上线