在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;
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))替换要替换的时间字段值。