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