话不多说,直接开始

以生成“用户表”测试数据为例

第一步:生成基础数据

//生成基础数据

delimiter $$

create procedure insert_llll(in start int(10),in max_num int(10))

begin

declare i int default 0;

declare newChar varchar(100) default '';

declare j int default 0;

set autocommit = 0;

repeat

set i = i +1;

set j = start+i;

set newChar = concat('', LPAD((i), 3, '0'));

insert into user_tb (Uid, head,wxAcount,wxName,zfbAcount,zfbName,tel,note) values (j,

substring(MD5(RAND()),1, RAND()*30), substring(MD5(RAND()),1, RAND()*20), substring(MD5(RAND()),1, RAND()*10), substring(MD5(RAND()),1, RAND()*10), substring(MD5(RAND()),1, RAND()*10), substring(MD5(RAND()),1, RAND()*10),

newChar);

until i = max_num

end repeat;

commit;

end $$

delimiter ;

//调用存储过程,生成note从001到999的999个数据

call insert_llll(1000000,999);

生成结果部分截图如下:

4eaa3f781338c019b9897f96f985e9a9.png

这里生成的最初的999个数据是最基础的原始数据,是最原始的“父编码”

第二步:生成之后的数据

基本原理:

1)从表中随机抽取一条纪录,提取其中的note值,将提取到的note值作为“父编码”;

2)随机一个1~200之间的整数(j),j也就是“父编码”的紧接着的下一级的子编码个数;

3)从1开始,一直到 j 进行循环,在每一次循环中插入 “父编码”+“xxx”,如:“父编码”为001,循环到第54个,那么“xxx”也就是054,最终插入的“新note”就是 001054。

4)这只是大致原理,最重要的还是看代码

delimiter $$

CREATE PROCEDURE `insert_la4`(in start int(10),in max_num int(10))

begin

/***** i 总循环计数 ******/

declare i int default 0;

declare k int default 0;

/***** j 子循环计数 ******/

declare j int default 0;

declare count int default 0;

/***** str1 父编码 ******/

declare str1 text default '';

/***** newChar 新生产的子编码部分 ******/

declare newChar varchar(100) default '';

/***** 最终插入时的note值(由str1和newChar拼凑而成)  ******/

declare res text default '';

#set autocommit = 0  //把autocommit设置成0,这样可以只提交一次,否则。。。。。

set autocommit = 0;

set k = start;

repeat

set i = i +1;

SELECT note into str1

FROM user_tb AS t1 JOIN (SELECT ROUND(RAND() * ((SELECT MAX(Uid) FROM user_tb)-(SELECT MIN(Uid) FROM user_tb))+(SELECT MIN(Uid) FROM user_tb)) AS Uid) AS t2

WHERE t1.Uid >= t2.Uid

ORDER BY t1.Uid LIMIT 1;

set j = 1+RAND()*200;

while count

set count = count +1;

/***** 将count变为001型的格式 ******/

set newChar = concat('', LPAD((count), 3, '0'));

set res = concat(str1, newChar);

set k = k+1;

insert into user_tb (head,wxAcount,wxName,zfbAcount,zfbName,tel,note) values (

substring(MD5(RAND()),1, RAND()*10), 1, 1, 1, 1, 1,

res);

end while;

set count = 0;

until i = max_num

end repeat;

commit;

end $$

delimiter ;

执行,ok,完美。几分钟后成功生成500W条数据

部分结果如下

4eaa3f781338c019b9897f96f985e9a9.png

备注:

1)如果要运行此存储过程,最好先把所有注释去掉,防止意外(!!!???);

2)推荐设计表时将Uid设为int自增型,否则每次插入时数据库都要进行一次查询(确保Uid,即主键不重复),这将花费大量大量大量的时间。(毕竟只是测试数据,将Uid设为int型也没啥大不了);

3)当然,这里的代码并不适合其他人,本文章仅供了解其中的大概原理

4)mysql自带的随机抽取函数效率太慢,因此从网上搜了一个

5)其实还可以继续提高效率,合并insert之类的,但现在的已经完全足够了,再花时间研究那些东西,数据都能生成几亿条了。。。。。。。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐