mysql应用之通过存储过程方式批量插入数据
我们平时的测试过程中有一个环节就是准备测试数据,包括准备基础数据,准备业务数据,使用的场景包括压力测试,后台批量数据传输,前端大数据查询导出,或者分页打印等功能,准备测试数据我们通俗点讲就是造数据,根据不同的使用场景我们有不同的造数据的方式,比如需要大数据时我们可以用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,
);
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,
);
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应用之通过存储过程方式批量插入数据的更多相关文章
- MySQL高级知识(十)——批量插入数据脚本
前言:使用脚本进行大数据量的批量插入,对特定情况下测试数据集的建立非常有用. 0.准备 #1.创建tb_dept_bigdata(部门表). create table tb_dept_bigdata( ...
- 将list<对象>转换成DataTable,把DataTable转换成参数传入存储过程实现批量插入数据
领导让在存储过程中批量添加数据,找出效率最高的,我看到后台代码后,发现可以将list<对象>转换成DataTable,把DataTable转换成参数传入存储过程实现批量插入数据,知道还有其 ...
- elasticsearch REST API方式批量插入数据
elasticsearch REST API方式批量插入数据 1:ES的服务地址 http://127.0.0.1:9600/_bulk 2:请求的数据体,注意数据的最后一行记得加换行 { &quo ...
- mybatis oracle两种方式批量插入数据
mybatis oracle两种方式批量插入数据 注意insert,一定要添加: useGeneratedKeys="false" ,否者会报错. <insert id=&q ...
- mybatis注解方式批量插入数据
@Insert("<script>" + "INSERT INTO cms_portal_menu(name,service_type,index_code) ...
- mybatis 注解写法 多层嵌套foreach,调用存储过程,批量插入数据
@Select("<script>" + "DECLARE @edi_Invoice_Details edi_Invoice_Details;" + ...
- mysql应用存储过程批量插入数据
--批量插入数据的sql语句 delimiter $$ DROP PROCEDURE IF EXISTS `test.sp_insert_batch` $$ CREATE DEFINER =`root ...
- C#批量插入数据到Sqlserver中的四种方式
我的新书ASP.NET MVC企业级实战预计明年2月份出版,感谢大家关注! 本篇,我将来讲解一下在Sqlserver中批量插入数据. 先创建一个用来测试的数据库和表,为了让插入数据更快,表中主键采用的 ...
- C#批量插入数据到Sqlserver中的三种方式
本篇,我将来讲解一下在Sqlserver中批量插入数据. 先创建一个用来测试的数据库和表,为了让插入数据更快,表中主键采用的是GUID,表中没有创建任何索引.GUID必然是比自增长要快的,因为你生 成 ...
随机推荐
- Burpsuite的Intruder模块发现敏感目录
提前配置好浏览器的代理设置,并且成功访问了目标地址(这里是http://192.168.146.133/WackoPicko) 1.在burpsuite的proxy栏目中,找到对WackoPicko路 ...
- UVa 1592 Database (map)
题意:给出n行m列的数据库(数据范围: n 1~10000, m 1~10), 问你能不能找出两行r1, r2,使得这两行中的c1, c2列是一样的, 即(r1,c1)==(r2,c1) && ...
- ZOJ - 3780-Paint the Grid Again-(拓扑排序)
Description Leo has a grid with N × N cells. He wants to paint each cell with a specific color (eith ...
- A. Blackjack
A. Blackjack time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...
- C++入门经典-例5.19-指针的引用与传递参数
1:引用传递参数与指针传递参数能达到同样的目的.指针传递参数也属于一种值传递,其传递的是指针变量的副本.如果使用指针的引用,就可以达到在函数体内改变指针地址的目的.运行代码如下: // 5.19.cp ...
- hibernate注解@manytoone,@onetomany
一.一对多(@onetomany) 1.单向一对多模型 假设通过一个客户实体可以获得多个地址信息.对于一对多的实体关系而言,表结构有两种设计策略,分别是外键关联和表关联. (1) 映射策略---外键关 ...
- for 循环 以及 for 循环的嵌套
格式:for (; ; ) 打印20遍你好 ; i <= ; i++) { Console.WriteLine("你好"); } 输入一个整数,计算从1加到这个数的结果 Co ...
- mysql replaceinto VS insertinto
https://blog.csdn.net/t8116189520/article/details/78908975 所以,若想基于插入值累加是不行的,需要insert into https://ww ...
- C语言转义字符表和ASCII码表
主要参考 http://www.51hei.com/mcu/4342.html 以及 https://www.cnblogs.com/jason207489550/p/6663444.html
- 浏览器端-3WSchool-JavaScript:JavaScript Boolean 对象
ylbtech-浏览器端-3WSchool-JavaScript:JavaScript Boolean 对象 1.返回顶部 1. Boolean 对象 Boolean 对象表示两个值:"tr ...