日期:2014-05-16  浏览次数:20793 次

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);