`

在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

分享到:
评论

相关推荐

    MySQL 关于表复制 insert into 语法的详细介绍

    下面我以mysql数据库为例分情况一一说明:两张表:insertTest和insertTest2,前者中有测试数据 代码如下:create table insertTest(id int(4),name varchar(12));insert into insertTest values(100,‘liudehua’);...

    如何优化MySQL insert性能

     经过对MySQL的测试,发现一些可以提高insert效率的方法,供大家参考参考。  1、一条SQL语句插入多条数据。  常用的插入语句如: INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`) ...

    MySQL select、insert、update批量操作语句代码实例

    项目中经常的需要使用批量操作语句对数据进行操作,使用批量语句的时候需要注意MySQL数据库的条件限制,这里主要是数据的大小限制,这里对批量插入、批量查找及批量更新的基础操作进行下简单的汇总。 1、批量insert...

    MySql基本查询、连接查询、子查询、正则表达查询讲解

    查询数据是指从数据库中的数据表或视图中获取所需要的数据,在mysql中,可以使用SELECT语句来查询数据。根据查询条件的不同,数据库系统会找到不同的数据。 SELECT语句的基本语法格式如下: [sql] view plain copy ...

    MySQL中文参考手册.chm

    5.1 MySQL对ANSI SQL92 的扩充 5.2 以ANSI模式运行 MySQL 5.3 MySQL相比ANSI SQL92的差别 5.4 MySQL 缺乏的功能 5.4.1 子选择(Sub-selects) 5.4.2 SELECT INTO TABLE 5.4.3 事务...

    MySql数据分区操作之新增分区操作

    正确的方法是新建一个具有分区的表,结构一致,然后用insert into 分区表 select * from 原始表; 测试创建分区表文件 代码如下: CREATE TABLE tr (id INT, name VARCHAR(50), purchased DATE) PARTITION BY RANGE...

    MySQL命令大全

     此操作使testuser能够在每一个test数据库中的表执行SELECT,INSERT和DELETE以及UPDATE查询操作。现在我们结束操作并退出MySQL客户程序:  mysql&gt; exit  Bye9! 1:使用SHOW语句找出在服务器上当前存在什么...

    MySQL中文参考手册

    + 5.4.2 SELECT INTO TABLE + 5.4.3 事务(Transactions) + 5.4.4 存储过程和触发器 + 5.4.5 外键(Foreign Keys) # 5.4.5.1 不使用外键的理由 + 5.4.6 视图(Views) + 5.4.7 '--'作为一个 注解的开始 o 5.5 ...

    MYSQL

    5.1 MySQL对ANSI SQL92 的扩充 5.2 以ANSI模式运行 MySQL 5.3 MySQL相比ANSI SQL92的差别 5.4 MySQL 缺乏的功能 5.4.1 子选择(Sub-selects) 5.4.2 SELECT INTO TABLE 5.4.3 事务...

    MYSQL常用命令大全

     此操作使testuser能够在每一个test数据库中的表执行SELECT,INSERT和DELETE以及UPDATE查询操作。现在我们结束操作并退出MySQL客户程序:  mysql&gt; exit  Bye9! 1:使用SHOW语句找出在服务器上当前存在什么...

    使用kettle将mysql中的数据导入到hive中

    先说说思路:1是直接从mysql输出至hive中,另外一个是先将数据搞到hdfs中,再load一下,当然这只是textfile存储格式而言,若是ORC等其他列式存储的话建议先搞一个textfile格式的中间表,再insert into table select ...

    Mysql数据表中的蠕虫复制使用方法

    mysql蠕虫复制,简单来说就是将查询出来的数据不断的新增插入到指定的数据表中。通常情况,mysql蠕虫复制时用来测试表压力。 下面我们就结合简单的实例给大家介绍mysql数据表中蠕虫复制的使用。 首先我们可以先查询...

    MySQL 入门学习 ——基础教程

    mysql&gt; insert into mytable -&gt; values (´abccs´,´f´,´1977-07-07´,´china´); Query OK, 1 row affected (0.05 sec) 再用上面的SELECT命令看看发生了什么变化。 我们可以按此方法一条一条地将所有员工...

    数据库MySQL-union(联合)

    插入测试数据 create table emp( id tinyint unsigned auto_increment primary key, name varchar(20) not null, skill set('PHP','mysql','java') ); insert into emp values (null,'李白',1),(null,'杜甫',2),...

    SQL培训第一期

    属性不依赖于其它非主属性,确保数据表中的每一列数据都和主键直接相关,而不能间接相关,即要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。 1.5.3.2 举例 党员表 党员Id 党员姓名 组织Code 符合3NF ...

    经典全面的SQL语句大全

     15、说明:选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.) select a,b,c from tablename ta where a=(select max(a) ...

    springmybatis

    创建用户表,并插入一条测试数据 程序代码 程序代码 Create TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `userName` varchar(50) DEFAULT NULL, `userAge` int(11) DEFAULT NULL, `userAddress` ...

    SqliteDev 384

     诚然SQLite允许忽略数据类型 但是仍然建议在你的Create Table语句中指定数据类型 因为数据类型对于你和其他的程序员交流 或者你准备换掉你的数据库引擎 SQLite支持常见的数据类型 如:  CREATE TABLE ex2  a ...

    SQLite(SqliteDev)

    SQLite,是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。...

Global site tag (gtag.js) - Google Analytics