Mysql 如何批量插入数据


Posted in MySQL onApril 06, 2021

比如你需要造一些压测数据,150万条,怎么快速做到呢?

下面使用存储函数和存储过程来批量插入数据。

# 1.创建数据库:
create database bigData;
use bigData;

# 2.创建表:
# 部门表
drop table if exists dept;
create table dept(
id int unsigned primary key auto_increment,
deptno mediumint unsigned not null default 0,
dname varchar(20) not null default "",
loc varchar(13) not null default ""
);
# 员工表
drop table if exists emp;
create table emp(
id int unsigned primary key auto_increment,
empno mediumint unsigned not null default 0 comment "编号",
ename varchar(20) not null default "" comment "名字",
job varchar(9) not null default "" comment "工作",
mgr mediumint unsigned not null default 0 comment "上级编号",
hiredate Date not null comment "入职时间",
sal decimal(7,2) not null comment "薪水",
comm decimal(7,2) not null comment "红利",
deptno MEDIUMINT UNSIGNED not null DEFAULT 0 comment "部门编号"
);

# 3.创建存储函数用来生成随机字符串和随机号码
/*随机字符生成函数*/
create function rand_string(n int) returns varchar(255)
begin
declare chars_str varchar(100) default 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
declare return_str varchar(255) default '';
declare i int default 0;
while i < n do
set return_str = CONCAT(return_str, SUBSTRING(chars_str, floor(1+RAND()*52),1));
set i = i + 1;
end while;
return return_str;
end;
# drop FUNCTION rand_string;
/*随机号码生成函数*/
create function rand_num()
returns int(5)
begin
declare i int default 0;
set i = floor(100+rand()*10);
return i;
end;
# drop function rand_num;

# 4.创建存储过程用来批量插入数据
/*批量插入员工存储过程*/
# drop procedure insert_emp;
create procedure insert_emp(in start_num int(10), in max_num int(10))
begin
declare i int default 0;
# 手动提交
set autocommit = 0;
REPEAT
	set i = i + 1;
	insert into emp(empno, ename,job,mgr,hiredate,sal,comm,deptno) values((start_num+i), rand_string(6), 'salesman', 1, curdate(), 2000, 400, rand_num());
UNTIL i = max_num END REPEAT;
commit;
end;
/*批量插入部门存储过程*/
# drop procedure if exists insert_dept;
create procedure insert_dept(in start_num int(10), in max_num int(10))
begin
declare i int default 0;
# 手动提交
set autocommit = 0;
REPEAT
	set i = i + 1;
	insert into dept(deptno, dname, loc) values((start_num+i), rand_string(10), rand_string(8));
UNTIL i = max_num END REPEAT;
commit;
end;

# 5.调用存储过程
# 添加30个部门,从101开始
call insert_dept(101, 30);
# 添加150万个员工,从1001开始
call insert_emp(1001, 1500000);

执行了好长时间。

# 5.调用存储过程
# 添加30个部门,从101开始
call insert_dept(101, 30)
> OK
> 时间: 0.073s


# 添加150万个员工,从1001开始
call insert_emp(1001, 1500000)
> OK
> 时间: 273.681s

其他(不用关注):

# 返回 0 到 1 的随机数 0.7290583464587651
select rand() from dual;
# 7.411780747037176
select 1+RAND()*52 from dual;
# 返回小于或等于 x 的最大整数 12
select floor(1+RAND()*52) from dual;
# 如果因为必须为存储函数指定一个参数报错,执行一下命令
show variables like 'log_bin_trust_function_creators';
set global log_bin_trust_function_creators=1;

当使用命令行时,语句结束符时;
若不想遇到分号结束,使用下面语句修改:

# 声明语句结束符$$
DELIMITER $$
MySQL 相关文章推荐
IDEA 链接Mysql数据库并执行查询操作的完整代码
May 20 MySQL
一看就懂的MySQL的聚簇索引及聚簇索引是如何长高的
May 25 MySQL
Navicat for MySQL的使用教程详解
May 27 MySQL
Navicat连接MySQL错误描述分析
Jun 02 MySQL
如何使用分区处理MySQL的亿级数据优化
Jun 18 MySQL
Unity连接MySQL并读取表格数据的实现代码
Jun 20 MySQL
为什么MySQL选择Repeatable Read作为默认隔离级别
Jul 26 MySQL
MySQL中连接查询和子查询的问题
Sep 04 MySQL
MySQL创建管理LIST分区
Apr 13 MySQL
mysql中关键词exists的用法实例详解
Jun 10 MySQL
MySQL存储过程及语法详解
Aug 05 MySQL
MySQL之DML语言
Apr 05 #MySQL
多属性、多分类MySQL模式设计
Apr 05 #MySQL
多表查询、事务、DCL
Mysql Show Profile
Apr 05 #MySQL
Mysql - 常用函数 每天积极向上
Apr 05 #MySQL
mysql多表查询-笔记七
Apr 05 #MySQL
mysql部分操作
Apr 05 #MySQL
You might like
PHP 模板高级篇总结
2006/12/21 PHP
修改apache配置文件去除thinkphp url中的index.php
2014/01/17 PHP
开源php中文分词系统SCWS安装和使用实例
2014/04/11 PHP
PHP获取当前页面URL函数实例
2014/10/22 PHP
win7系统配置php+Apache+mysql环境的方法
2015/08/21 PHP
PHP重置数组为连续数字索引的几种方式总结
2018/03/12 PHP
laravel 5.4 + vue + vux + element的环境搭配过程介绍
2018/04/26 PHP
[Web]防止用户复制页面内容和另存页面的方法
2009/02/06 Javascript
使用jquery选择器如何获取父级元素、同级元素、子元素
2014/05/14 Javascript
a标签click和href执行顺序探讨
2014/06/23 Javascript
javascript操作字符串的原生方法
2014/12/22 Javascript
php+ajax+jquery实现点击加载更多内容
2015/05/03 Javascript
Bootstrap布局之栅格系统详解
2016/06/13 Javascript
详解AngularJs中$sce与$sceDelegate上下文转义服务
2016/09/21 Javascript
使用json来定义函数,在里面可以定义多个函数的实现方法
2016/10/28 Javascript
手机端js和html5刮刮卡效果
2020/09/29 Javascript
使用微信内嵌H5网页解决JS倒计时失效问题
2017/01/13 Javascript
js+html5实现复制文字按钮
2017/07/15 Javascript
JS使用setInterval实现的简单计时器功能示例
2018/04/19 Javascript
js实现删除li标签一行内容
2019/04/16 Javascript
vue 项目 iOS WKWebView 加载
2019/04/17 Javascript
layui+SSM的数据表的增删改实例(利用弹框添加、修改)
2019/09/27 Javascript
javascript实现的图片预览和上传功能示例【兼容IE 9】
2020/05/01 Javascript
基于js实现数组相邻元素上移下移
2020/05/19 Javascript
Python HTMLParser模块解析html获取url实例
2015/04/08 Python
Python中特殊函数集锦
2015/07/27 Python
Python 模拟员工信息数据库操作的实例
2017/10/23 Python
Python pyinotify模块实现对文档的实时监控功能方法
2018/10/13 Python
Softmax函数原理及Python实现过程解析
2020/05/22 Python
Python使用plt.boxplot() 参数绘制箱线图
2020/06/04 Python
matplotlib部件之矩形选区(RectangleSelector)的实现
2021/02/01 Python
学生爱国演讲稿
2014/01/14 职场文书
校园文化建设方案
2014/02/03 职场文书
分公司任命书
2014/06/06 职场文书
2014年药房工作总结
2014/11/22 职场文书
社区端午节活动总结
2015/02/11 职场文书