vlambda博客
学习文章列表

Mysql插入大量随机数据

有时出于学习和测试的目的,我们往往需要在表中插入大量随机数据。

以下例子是在网上查阅了大量资料后,借鉴并修改过的。并已实践过是可行的,可放心使用。

 

 

先创建数据库

 

create database mytest;

 

再定义两张表

 

create table company(

id int unsigned primary key auto_increment,

companyid mediumint unsigned not null default 0,

companyname varchar(30) not null default "",

location varchar(20) not null default ""

)engine=innodb default charset=utf8;

 

create table personalinfo(

id int unsigned primary key auto_increment,

personalid mediumint unsigned not null default 0,

personalname varchar(20) not null default "",

job varchar(9) not null default "",

manager mediumint unsigned not null default 0,

enterdate date not null,

salary decimal(7,2) not null,

comm decimal(7,2) not null,

companyid mediumint unsigned not null default 0

)engine=innodb default charset=utf8;

 

由于需要在库中创建函数,我们需要设定一个参数

 

set global log_bin_trust_function_creators=ON;

 

创建如下两个函数:

 

delimiter |

create function rdm_str(n int) returns varchar(300)    -----------产生指定长度的随机字符

begin

declare base_str varchar(100) default 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';

declare ret_str varchar(300) default '';

declare i int default 0;

while i < n do

set ret_str = concat(ret_str,substring(base_str,floor(1 +rand()*62),1));

set i = i + 1;

end while;

return ret_str;

end |

 

 

delimiter |

create function rdm_nb() returns int(8)      -----------产生随机数字

begin

declare i int default 0;

set i = floor(10000 +rand()*20);

return i;

end |

 

再创建两个存储过程(进行数据插入)

 

delimiter |

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

begin

declare i int default 0;

set autocommit=0;

repeat

set i=i+1;

insert into company(companyid,companyname,location) values ((start+i),rdm_str(20),rdm_str(16));

until i=max_num

end repeat;

commit;

end |

 

 

delimiter |

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

begin

declare i int default 0;

set autocommit=0;

repeat

set i=i+1;

insert into personalinfo(personalid,personalname,job,manager,enterdate,salary,comm,companyid) values ((start+i),rdm_str(12),'salesman',0001,curdate(),2000,400,rdm_nb());

until i=max_num

end repeat;

commit;

end |

 

以上都做完后,我们接着就是调用这些存储过程。

 

首先将分隔符恢复为;

delimiter ;

 

插入20条公司数据

call inst_company(10000,20);

 

插入个人数据(40万条)

call inst_personal(100001,500000);