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 相关文章推荐
Mysql Online DDL的使用详解
May 20 MySQL
MySQL修改默认引擎和字符集详情
Sep 25 MySQL
解决Mysql多行子查询的使用及空值问题
Jan 22 MySQL
详解MySql中InnoDB存储引擎中的各种锁
Feb 12 MySQL
MySQL 开窗函数
Feb 15 MySQL
SQL注入篇学习之盲注/宽字节注入
Mar 03 MySQL
数据分析数据库ClickHouse在大数据领域应用实践
Apr 03 MySQL
MySQL数据库如何使用Shell进行连接
Apr 12 MySQL
MySQL批量更新不同表中的数据
May 11 MySQL
MySQL运行报错:“Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggre”解决方法
Jun 14 MySQL
MySQL性能指标TPS+QPS+IOPS压测
Aug 05 MySQL
MySQL中LAG()函数和LEAD()函数的使用
Aug 14 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
Laravel5.5+ 使用API Resources快速输出自定义JSON方法详解
2020/04/06 PHP
从JavaScript 到 JQuery (1)学习小结
2009/02/12 Javascript
动态加载外部javascript文件的函数代码分享
2011/07/28 Javascript
js调用activeX获取u盘序列号的代码
2011/11/21 Javascript
用JQUERY增删元素的代码
2012/02/14 Javascript
JQuery实现绚丽的横向下拉菜单
2013/12/19 Javascript
JQuery为页面Dom元素绑定事件及解除绑定方法
2014/04/23 Javascript
JavaScript设计模式之策略模式实例
2014/10/10 Javascript
JavaScript实现N皇后问题算法谜题解答
2014/12/29 Javascript
javascript密码强度校验代码(两种方法)
2015/08/10 Javascript
jquery中checkbox使用方法简单实例演示
2015/11/24 Javascript
Jquery ui datepicker设置日期范围,如只能隔3天【实现代码】
2016/05/04 Javascript
JS脚本实现动态给标签控件添加事件的方法
2016/06/02 Javascript
原生态js,鼠标按下后,经过了那些单元格的简单实例
2016/08/11 Javascript
js时间戳和c#时间戳互转方法(推荐)
2017/02/15 Javascript
layer弹出层中H5播放器全屏出错的解决方法
2017/02/21 Javascript
JavaScript实现三级联动效果
2017/07/15 Javascript
jquery-file-upload 文件上传带进度条效果
2017/11/21 jQuery
jQuery内容选择器与表单选择器实例分析
2019/06/28 jQuery
《javascript设计模式》学习笔记三:Javascript面向对象程序设计单例模式原理与实现方法分析
2020/04/07 Javascript
vue-router的hooks用法详解
2020/06/08 Javascript
pyhanlp安装介绍和简单应用
2019/02/22 Python
Python创建一个元素都为0的列表实例
2019/11/28 Python
Docker部署Python爬虫项目的方法步骤
2020/01/19 Python
解决matplotlib.pyplot在Jupyter notebook中不显示图像问题
2020/04/22 Python
英国邮购活的植物主要供应商:Gardening Direct
2019/01/28 全球购物
致短跑运动员广播稿
2014/01/09 职场文书
拾金不昧表扬信范文
2014/01/11 职场文书
表彰大会策划方案
2014/05/13 职场文书
考试作弊检讨书1000字(5篇)
2014/10/19 职场文书
2014年销售员工作总结
2014/12/01 职场文书
小学语文复习计划
2015/01/19 职场文书
2015年妇幼卫生工作总结
2015/05/23 职场文书
八一建军节主持词
2015/07/01 职场文书
出纳2015年度工作总结范文
2015/10/14 职场文书
2019西餐厅创业计划书范文!
2019/07/12 职场文书