使用mysql 游标,快速删除子节点及其附属节点
发表于:2025-02-07 作者:千家信息网编辑
千家信息网最后更新 2025年02月07日,上篇,我写了如何使用html展示数据库中存储的树形结构, 本篇我将说一下如何通过存储过程,快速删除一个树节点及其附属节点。网上已经有非常多的关于mysql 游标使用的文章了, 为什么我还要写这篇文章呢
千家信息网最后更新 2025年02月07日使用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安全错误
数据库的锁怎样保障安全
SQL数据库优化产品
数据库 18456
计算机信息网络技术的课程设置
网络安全整改情况自查报告
网络安全培训开展情况
win7密钥管理服务器不可用
Web服务器搭建与管理题库
群集服务器工具
数据库各种模式在哪个阶段完成
传奇霸业vip数据库
三级网络技术应用题答题技巧
104软件开发说明书
向数据库中添加自由表
合肥高新区软件开发培训排名
可乐云服务器
公安局网络安全宣传活动
网卡驱动软件开发
金华轶诺网络技术
安全服务器指什么
佛山商城软件开发咨询
安卓应用软件开发工程师证书
中软网络安全培训考试
普陀区参考数据库优点
代理服务器规则列表
中国金融软件开发商
服务器设备搬迁报价清单
数据库技术就业要求
移动维护网络安全吗
软件开发与实践大作业
网络安全测试分那几个部门