日期:2014-05-16 浏览次数:20793 次
由于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);