欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-05-08 18:37:14
...

        需求是我想重复插入大量数据,那么首先想到的,就是用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