在MySql中利用insert into select准备测试数据

        需求是我想重复插入大量数据,那么首先想到的,就是用insert into select语句。首先将当前表的数据备份。

create table table_name_bak as select * from table_name;

        然后,从备表中的数据往原表中新增,写了个存储过程如下:

drop procedure if exists initTestData;

DELIMITER //
create procedure initTestData()
begin
    declare i int default 1;
    while(i<=100) do
		insert into table_name
		select
		   replace(uuid(), '-',''),
		   CONCAT(FLOOR(2010 + (RAND() * 5)),'-',LPAD(FLOOR(1 + (RAND() * 12)),2,0),'-',LPAD(FLOOR(1 + (RAND() * 28)),2,0), ' ', LPAD(FLOOR(0 + (RAND() * 24)),2,0),':',LPAD(FLOOR(0 + (RAND() * 60)),2,0),':',LPAD(FLOOR(0 + (RAND() * 60)),2,0)),
		   update_time
		from table_name_bak;
	set i=i+1;
    END while;
END  //

        调用此存储过程。

##调用此存储过程
call initTestData();

特别说明:

        1.主键冲突用replace(uuid(), '-','')生成”表内”的唯一值解决。

        2.因业务测试点需要时间是随机的,至少不要是一样的,以能模拟生产环境的数据,特用CONCAT(FLOOR(2010 + (RAND() * 5)),'-',LPAD(FLOOR(1 + (RAND() * 12)),2,0),'-',LPAD(FLOOR(1 + (RAND() * 28)),2,0), ' ', LPAD(FLOOR(0 + (RAND() * 24)),2,0),':',LPAD(FLOOR(0 + (RAND() * 60)),2,0),':',LPAD(FLOOR(0 + (RAND() * 60)),2,0))随机生成2010年到2015年之间的日期数据。

附:mySql取某个范围内随机日期FLOOR和LPAD

#取7到12的随机整数,包括7到12
SELECT FLOOR(7 + (RAND() * 6));

#取12到24的随机整数,包括12到24
SELECT FLOOR(12+(rand()*13));

#取0-23之间的随机数,包括0到23
SELECT FLOOR(0 + (RAND() * 23));

#LPAD(str,len,padstr),返回字符串str,左填充用字符串padstr填补到len字符长度。 如果str为大于len长,返回值被缩短至len个字符(即,不能超过 len 长)
SELECT LPAD('HI', 4 , '?'); #运行结果:??HI
SELECT LPAD('HELLO', 4 , '?'); #运行结果:HELL

#取0-24之间的随机数,不够2位的前补0
SELECT LPAD(FLOOR(0 + (RAND() * 23)),2,0);

#获取一个随机日期,年份为2000-2015
select CONCAT(FLOOR(2000 + (RAND() * 16)),'-',LPAD(FLOOR(1 + (RAND() * 12)),2,0),'-',LPAD(FLOOR(3 + (RAND() * 28)),2,0));

#获取一个随机时间
select CONCAT(LPAD(FLOOR(0 + (RAND() * 24)),2,0),':',LPAD(FLOOR(0 + (RAND() * 60)),2,0),':',LPAD(FLOOR(0 + (RAND() * 60)),2,0));

#获取一个年份在2000-2016年之间的一个随机时间,格式为:yyyy-MM-dd hh24:mi:ss
select CONCAT(FLOOR(2000 + (RAND() * 16)),'-',LPAD(FLOOR(1 + (RAND() * 12)),2,0),'-',LPAD(FLOOR(3 + (RAND() * 28)),2,0), ' ', LPAD(FLOOR(0 + (RAND() * 24)),2,0),':',LPAD(FLOOR(0 + (RAND() * 60)),2,0),':',LPAD(FLOOR(0 + (RAND() * 60)),2,0));

附:表字段太多处理方法

1.先进入数据库,执行show create table table_name;
2.把表的所有字段复制
3.退出数据库,创建一个临时文件,将复制内容保存到这个临时文件中
4.用Linux命令处理字段为逗号分隔,cat file_name | awk -F '`' '{print $2}' | tr '\n' ','
5.根据如下原始SQL和逗号分隔的字段,组织SQL:insert into table_name() select from table_name_bak;
6.修改表名、贴上字段,最后用replace(uuid(), '-','')替换主键、唯一索引字段值,用CONCAT(FLOOR(2010 + (RAND() * 5)),'-',LPAD(FLOOR(1 + (RAND() * 12)),2,0),'-',LPAD(FLOOR(1 + (RAND() * 28)),2,0), ' ', LPAD(FLOOR(0 + (RAND() * 24)),2,0),':',LPAD(FLOOR(0 + (RAND() * 60)),2,0),':',LPAD(FLOOR(0 + (RAND() * 60)),2,0))替换要替换的时间字段值。

参考文章:http://blog.csdn.net/angus_17/article/details/8020833

猜你喜欢

转载自bijian1013.iteye.com/blog/2306590
今日推荐