需求是我想重复插入大量数据,那么首先想到的,就是用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))替换要替换的时间字段值。