我们平时的测试过程中有一个环节就是准备测试数据,包括准备基础数据,准备业务数据,使用的场景包括压力测试,后台批量数据传输,前端大数据查询导出,或者分页打印等功能,准备测试数据我们通俗点讲就是造数据,根据不同的使用场景我们有不同的造数据的方式,比如需要大数据时我们可以用jmeter压测获取大数据,也可以导入生产数据,简单少许的测试数据我们直接在数据库中插入,本篇主要记录的是另外一种造数据的方式——通过编写存储过程来实现批量数据插入。

一、编写调用存储过程:

数据库类型:mysql

需求:在user表中插入数据,user表主键为id,id方式为长度为32位的字母+数字随机字符串

1、创建存储过程

 DELIMITER $$
USE `db_test`$$
DROP PROCEDURE IF EXISTS `proc_user`$$ CREATE DEFINER=`root`@`%` PROCEDURE `proc_user`()
BEGIN
DECLARE user_name VARCHAR(60);
DECLARE email VARCHAR(150);
DECLARE rand_id VARCHAR(120);
DECLARE id VARCHAR(120);
DECLARE i INT DEFAULT 1000;
DECLARE createtime DATETIME;
DECLARE tel_body VARCHAR(40);
DECLARE tel VARCHAR(60);
-- 调试过程, 先插入5条
WHILE i <= 1005 DO
-- user_name = test + i
SET user_name = CONCAT('test', i);
SET email = CONCAT(user_name,'@qq.com');
SET rand_id= SUBSTRING(MD5(RAND()),1,28);
-- id = rand_id + i, +i的目的主要是为了区分测试数据与user_name对应
SET id = CONCAT(rand_id, i);
SET createtime = NOW();
SET tel_body = FLOOR(RAND()*100000000);
-- tel = 159开头随机号码
SET tel = CONCAT('', tel_body); INSERT INTO `user`
VALUES(id,
user_name,
'202cb962ac59075b964b07152d234b70',
'0cc495f78776486294ebc7c08831aabe',
NULL,
createtime,
tel,
email
);
SET i=i+1;
END WHILE;
END$$

2、调用存储过程

 CALL `proc_user`();

3、查看表数据

4、模拟批量插入5000条数据,

1)调用存储过程,全部数据插入完成耗时如下:

2)核对数据库插入数据总量

二、上述方法是将插入记录数作为一个固定值,直接写在存储过程中,其实还可以设置参数,调用存储过程时传递需要插入的记录行数,如下:

 -- 传参数的方法
DELIMITER $$
USE `db_test`$$
DROP PROCEDURE IF EXISTS `proc_user`$$ CREATE DEFINER=`root`@`%` PROCEDURE `proc_user`(IN cn INT(4))
BEGIN
DECLARE user_name VARCHAR(60);
DECLARE email VARCHAR(150);
DECLARE rand_id VARCHAR(120);
DECLARE id VARCHAR(120);
DECLARE i INT DEFAULT 1000;
DECLARE createtime DATETIME;
DECLARE tel_body VARCHAR(40);
DECLARE tel VARCHAR(60);
-- 判定条件,i<=cn则插入
WHILE i <= cn DO
SET user_name = CONCAT('test', i);
SET email = CONCAT(user_name,'@qq.com');
SET rand_id= SUBSTRING(MD5(RAND()),1,28);
SET id = CONCAT(rand_id, i);
SET createtime = NOW();
SET tel_body = FLOOR(RAND()*100000000);
SET tel = CONCAT('', tel_body); INSERT INTO `user`
VALUES(id,
user_name,
'202cb962ac59075b964b07152d234b70',
'0cc495f78776486294ebc7c08831aabe',
NULL,
createtime,
tel,
email
);
SET i=i+1;
END WHILE;
END$$ -- 传参数的方法CALL `proc_user`(cn); -- cn为任意大于1000小于9999的数值
CALL `proc_user`(1100);

三、函数简要解释:

1、CONCAT()函数:

拼接函数,将多个字符串拼接成一个字符串,语法为:CONCAT(str1,str2,…)

2、RAND()函数,FLOOR()函数:

RAND(),0-1之间的随机数,带小数点

FLOOR(),取整;

FLOOR(RAND() *10),获得0-10之间的整数(包含0,不包含10);FLOOR(RAND() *100000000),获取10000000-99999999之间的随机整数

3、SUBSTRING()函数:

截取子字符串函数,从特定位置开始的字符串返回一个给定长度的子字符串

语法:SUBSTRING(字符串,位置,长度),如SUBSTRING(MD5(RAND()),1,28),从MD5随机字符串的第1位开始截取长度为28位的子字符串

mysql应用之通过存储过程方式批量插入数据的更多相关文章

  1. MySQL高级知识(十)——批量插入数据脚本

    前言:使用脚本进行大数据量的批量插入,对特定情况下测试数据集的建立非常有用. 0.准备 #1.创建tb_dept_bigdata(部门表). create table tb_dept_bigdata( ...

  2. 将list<对象>转换成DataTable,把DataTable转换成参数传入存储过程实现批量插入数据

    领导让在存储过程中批量添加数据,找出效率最高的,我看到后台代码后,发现可以将list<对象>转换成DataTable,把DataTable转换成参数传入存储过程实现批量插入数据,知道还有其 ...

  3. elasticsearch REST API方式批量插入数据

    elasticsearch REST API方式批量插入数据 1:ES的服务地址  http://127.0.0.1:9600/_bulk 2:请求的数据体,注意数据的最后一行记得加换行 { &quo ...

  4. mybatis oracle两种方式批量插入数据

    mybatis oracle两种方式批量插入数据 注意insert,一定要添加: useGeneratedKeys="false" ,否者会报错. <insert id=&q ...

  5. mybatis注解方式批量插入数据

    @Insert("<script>" + "INSERT INTO cms_portal_menu(name,service_type,index_code) ...

  6. mybatis 注解写法 多层嵌套foreach,调用存储过程,批量插入数据

    @Select("<script>" + "DECLARE @edi_Invoice_Details edi_Invoice_Details;" + ...

  7. mysql应用存储过程批量插入数据

    --批量插入数据的sql语句 delimiter $$ DROP PROCEDURE IF EXISTS `test.sp_insert_batch` $$ CREATE DEFINER =`root ...

  8. C#批量插入数据到Sqlserver中的四种方式

    我的新书ASP.NET MVC企业级实战预计明年2月份出版,感谢大家关注! 本篇,我将来讲解一下在Sqlserver中批量插入数据. 先创建一个用来测试的数据库和表,为了让插入数据更快,表中主键采用的 ...

  9. C#批量插入数据到Sqlserver中的三种方式

    本篇,我将来讲解一下在Sqlserver中批量插入数据. 先创建一个用来测试的数据库和表,为了让插入数据更快,表中主键采用的是GUID,表中没有创建任何索引.GUID必然是比自增长要快的,因为你生 成 ...

随机推荐

  1. python之timeit模块

    timeit模块: timeit 模块定义了接受两个参数的 Timer 类.两个参数都是字符串. 第一个参数是你要计时的语句或者函数. 传递给 Timer 的第二个参数是为第一个参数语句构建环境的导入 ...

  2. Java 内部类、成员类、局部类、匿名类等

    Java各种称呼类详解 Java有各种各样类,内部类.嵌套类.成员类.局部类(本地类).静态类.匿名类.文件类以及这些组合起来的称呼类,成员内部类,成员匿名类,成员嵌套类,本地匿名类等,真是多的不行, ...

  3. Spring boot之使用thymeleaf

    操作步骤 (1)在pom.xml中引入thymeleaf; (2)如何关闭thymeleaf缓存 (3)编写模板文件.html (4)编写访问模板文件controller 在pom.xml中引入thy ...

  4. Spring boot之Hello World访问404

    (1)404 -- 确定地址是否输入正确,,此路径非彼路径 (2)404 -- 是否用对注解,此注解非彼注解 (3)404 -- 包路径是否正确,此包非彼包 (4)404 -- 确认类包是否正确,此类 ...

  5. java 多线程为何会出现无法捕获异常的现象?

    提出问题: 很多Java初学者在初学java 多线程的时候可能会看到如下代码: public class ExceptionThread implements Runnable{ @Override ...

  6. RocketMQ存储系统概要设计和源码解读

    普遍消息存储技术的选型 分布式KV存储 NewSQL存储:TiDB 文件系统:RocketMQ,kafka,RabbitMQ RocketMQ:所有的message存储在一个log里,不区分topic ...

  7. maven 配置国内镜像仓库加速获取jar包的配置方法

    在 maven 的 conf/settings.xml 中配置 <mirrors> <!-- mirror | Specifies a repository mirror site ...

  8. MessageWebSocket

    using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; usi ...

  9. gcc编译错误

    使用boost的时候遇到一个链接错误 undefined reference to `boost::system::detail::generic_category_instance 出现这个问题的有 ...

  10. 如何将浏览器上的JS文件屏蔽

    在学习自定验证时,需要在页面上进行调试运行结果,这时的JS会影响运行结果的显示,所以我们会将JS代码屏蔽掉,那么我们该如何做呢? 第一步: 在浏览器地址栏输入about:config  点击“我保证会 ...