使用mysql 游标,快速删除子节点及其附属节点

上篇,我写的是如何用数据存储,并通过html展示出树形的结构, 本篇我将讲述,如何通过存储过程,删除一个树节点及其附属节点。网上已经有非常多的关于mysql 游标使用的文章了, 为什么我还要写这篇文章呢,主要是想表达一些在软件设计领域的一些想法。

我不赞同在数据库中大量的使用存储过程, 因为我觉得随着软件系统的复杂度逐渐提高,维护的难度会逐渐的增大。而且大批量的使用存储过程,不利于后期通过分布式部署应用程序来解决日益增多的业务需求。

我推荐把存储过程用在处理一些不包含太多业务,批量操作数据的场景中,因为这样会降低批量提交数据到数据库或者频繁的跟数据库操作情况的发生。删除一个树的子节点正好符合这一场景。

我们知道业务上删除一个树节点的同时,需要删除其子节点或叶子节点。通过使用mysql的游标,我们可以遍历某一节点的所有子节点,通过使用递归,我们可以跨越多层直至叶子节点。

要实现删除一个树节点, 一个存储过程肯定可以搞定,但是为了让程序逻辑更简单些, 我写了两个存储过程,一个用来获取存储过程所有符合条件的节点,另一个用来执行删除操作。 整个存储过成的入口是目标存储过程的节点id。

遍历节点,找出符合节点及其所有的子节点的实现是这样的。

/* 创建一个获取树节点及其子节点的函数,并以 节点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
时间: 2024-10-08 10:45:06

使用mysql 游标,快速删除子节点及其附属节点的相关文章

Innodb中mysql如何快速删除2T的大表

小漫画 来,先来看小漫画陶冶一下情操OK,这里就说了.假设,你有一个表erp,如果你直接进行下面的命令这个时候所有的mysql的相关进程都会停止,直到drop结束,mysql才会恢复执行.出现这个情况的原因就是因为,在drop table的时候,innodb维护了一个全局锁,drop完毕锁就释放了. 这意味着,如果在白天,访问量非常大的时候,如果你在不做任何处理措施的情况下,执行了删大表的命令,整个mysql就挂在那了,在删表期间,QPS会严重下滑,然后产品经理就来找你喝茶了.所以才有了漫画中的

mysql如何快速删除重复的数据

在mysql中去重,其实是一个很简单的事情,来看下面的例子: mysql> DROP TABLE test; Query OK, 0 rows affected (0.01 sec) mysql> CREATE TABLE test ( id  INT, NAME VARCHAR(10) ); Query OK, 0 rows affected (0.01 sec) mysql> INSERT INTO test VALUES(1,'a1'),(2,'a2'),(3,'a3'),(4,'

mysql下如何删除本节点下的所有子节点小记

在开发过程中,经常会遇到树形结构的数据,在删除某个节点时候其所有的子节点都要被删除,可以使用如下方法: 1.添加记录该节点所有父节点的ID的字段(parent_ids),并用逗号隔开(一定是逗号),如1,2,3 2.删除时使用find_in_set 函数,如:id=#{当前节点ID} and find_in_set(#{当前节点ID},parent_ids) 原文地址:https://www.cnblogs.com/wangxulong/p/8541600.html

删除子节点removeChild()

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" con

mysql 使用游标进行删除操作的存储过程

BEGIN DECLARE  hprocessInstanceId bigint DEFAULT 0; -- 历史流程实例id DECLARE  hprocessInstanceIdStarttime CHAR default '';  -- 历史流程实例启动时间 DECLARE  hprocessInstanceIdEndtime CHAR default '';  -- 历史流程实例结束时间 DECLARE  hactinstId BIGINT default 0;  -- 历史活动实例id

mysql存储过程快速入门

一.创建存储过程 创建存储过程(一) create PROCEDURE pro1() BEGIN select 'Hello World'; END; //执行存储过程 call proc1(); 创建存储过程的基本形式 CREATE PROCEDURE sp_name([proc_parameter[,…]]) [characteristic …] routine_body 其中: sp_name:存储过程名称 proc_parameter:存储过程参数,可以为in,out,inout参数,其

HDU2473 - Junk-Mail Filter 利用虚拟数组实现删除并查集的节点

HDU2473 - Junk-Mail Filter: http://acm.hdu.edu.cn/showproblem.php?pid=2473 题目大意: M a b,代表a和b是同一类的,S a,代表原先给出的a的信息是错的,现在将其单独分成一类. 求最后一共有多少类邮件. 若只是分类,很直接就会想到并查集.但这里若直接用并查集是会出错的,因为删除的那个节点后面还可能会有其他的子节点,若直接把其删除,结果会出错. 这里就需要用到一个虚拟数组Trick,和Father数组合作,实现"删除&

【mysql创建用户|删除用户|修改用户权限|常用命令】

原文链接:http://blog.csdn.net/leili0806/article/details/8573636 1.       CREATE USER 语法: CREATE USER 'username'@'host' IDENTIFIED BY 'password'; 例子: CREATE USER 'dog'@'localhost' IDENTIFIED BY '123456'; CREATE USER 'pig'@'192.168.1.101_' IDENDIFIED BY '1

关于mysql的级联删除(之前好多人咨询过我)

最近许多项目咨询,mysql进行级联删除的问题.在此做个系统的扫盲. 一 什么是级联删除. 即依赖于外键关系,删除父表时,一并删除独立依赖于此表的子表. 二 如何做到级联删除 其实非常简单,需要建立表的时候明确指定,外键依赖关系的属性为允许级联删除. ON DELETE CASCADE 三 使用级联删除有什么优缺点 优点很明显,程序删除时变简单了. 缺点也很明显,业务设计时做删除考虑时需要更高的要求.否则易出问题.