MYSQL—递归插入树形数据脚本

由于MySQL不支持对函数的递归调用,所以我在写的时候采用了递归调用自己的方式来实现。

两个实体表 `ump`.`klt_ki` 和 `ump`.`klt_kc` ,其中后者为树形结构表(klpk_kc_uuid与pid字段标识父子关系)

具体脚本如下:

DELIMITER $$

DROP PROCEDURE IF EXISTS `ump`.`inserttree_new`$$

CREATE DEFINER=`root`@`localhost` PROCEDURE `inserttree_new`(
  IN deep int,     ##层数(大于1)
  IN number int,   ##每层个数(大于1)
  IN pid long,     ##固定值为 -1
  IN kinum int    ##每种知识类别对应的知识项数目
)

BEGIN

  declare i int default number;

  declare j int default 0;

  declare treecode varchar(255) default '';

  ## 定义知识项的id(随机数)
  declare kiid long default 0;

  declare id long default 0;

  SET @@max_sp_recursion_depth = 100;

  while i > 0
 
  do

    set i = i - 1;

    ## 设定一个随机数作为知识类别表的id
    set id = RAND();

    select id;

    set treecode = (select `tree_code` from `ump`.`klt_kc` where `klpk_kc_uuid`=pid);

    if treecode is not null then

       set treecode = CONCAT(treecode,id,'_');

    end if;

    if treecode is null then

       set treecode = CONCAT(id,'_');

    end if;
   
    ## 在知识类别表中插入数据
    insert into `ump`.`klt_kc`(`klpk_kc_uuid`,`topic`,`pid`,`tree_code`) values (id,CONCAT('name', id),pid,treecode);

    set j = 0;

    while j < kinum

    do
   
        set j = j + 1;

        ## 设定一个随机数作为知识项表的id
        set kiid = RAND();

        insert into `ump`.`klt_ki`(`klpk_ki_uuid`,`klfk_kc_uuid`,`topic`,`source`,`createtime_datetime`,`kc_treecode`) values (kiid,id,CONCAT('topic', kiid),'SERVICE',now(),treecode);

    end while;

    if deep > 1 then
     
       call inserttree_new(deep-1,number,id,kinum);

    end if;

  end while;

END$$

DELIMITER ;

 

参数及使用说明:

##deep 分类树的层数(大于1)
##number 每个分类的子分类个数(大于1)
##pid 根节点的父节点id,固定值为 -1
##kinum 每种知识类别对应的知识项数目(大于等于1)
##下面是一个调用的例子
call inserttree_new(2,2,-1,2);

你可能感兴趣的:(数据结构,mysql,脚本,J#)