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

  

/*,创建一个获取树节点及其子节点的函数,并以,节点id1、,节点id2 的形式返回,*/DROP  PROCEDURE  IF  EXISTS  get_tree_node;   CREATE , PROCEDURE  get_tree_node (node_id 拷贝,INT, OUT  result  VARCHAR (2000))   BEGIN ,,,,,   ,,,DECLARE  nodeid  INT (50);,,   DECLARE 才能done  INT  DEFAULT  0;,,   ,,,,DECLARE  cur  CURSOR  FOR  SELECT  id 得到treenodes  WHERE  pid =, node_id;   ,,,DECLARE  CONTINUE  HANDLER  FOR  NOT  found  SET  done =,真的;      #才能,这一句非常重要,,他可以保证存储过程至少会返回一个根节点id、调用,CONCAT_WS 函数时就不会出错了   SELECT 才能id  INTO  result 得到treenodes  WHERE  id=, node_id;      OPEN 才能,坏蛋;   ,重复   ,,,,,,,,,,,FETCH  cur  INTO  nodeid;,,,,,,,,,,,,,,,,,,,,,   ,,,,,#,避免多一条记录   ,,,,,IF  done  & lt;祝辞,1,THEN ,,,,,,,,,,,,,,,   ,,,,,,,#,调用递归函数获取节点下的子节点   ,,,,,,,CALL  get_tree_node (nodeid, @ temp);,,,,,,,,,,,,   ,,,,,,,#,合并父节点和子节点的id   ,,,,,,,,,,,,,,,SELECT  CONCAT_WS(结果”、“,,,,@ temp), INTO 结果;   ,,,,,,,,,,,最终获得;如果;   ,,,UNTIL  done 最终获得重复;,,   #,才能关闭光标   ,,,CLOSE 坏蛋;      结束;

/*,删除一个节点及其附属节点,*/DROP  PROCEDURE  IF  EXISTS  delete_tree_node;   CREATE  PROCEDURE  delete_tree_node (node_id 拷贝;int)   开始   ,,,SET , max_sp_recursion_depth =, 10;   ,,,CALL  get_tree_node (@result node_id也);   ,,,DELETE 得到treenodes  WHERE  FIND_IN_SET (id, @result);   ,,,DELETE 得到books  WHERE  FIND_IN_SET (id, @result);   

结束这里注意max_sp_recursion_depth这个msyql参数和FIND_IN_SET函数。

max_sp_recursion_depth控制可以执行递归的层数,

FIND_IN_SET函数的作用,会将@result先变为一个字符串列的表,再查找复合条件的值。这里若用在关键字的话,将得不到任何结果

  附件:http://down.51cto.com/data/2366729

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