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 相关文章推荐
MySQL8.0.24版本Release Note的一些改进点
Apr 22 MySQL
MySQL 可扩展设计的基本原则
May 14 MySQL
MySQL中的布尔值,怎么存储false或true
Jun 04 MySQL
解决mysql的int型主键自增问题
Jul 15 MySQL
MySQL配置主从服务器(一主多从)
Aug 07 MySQL
MySQL中几种插入和批量语句实例详解
Sep 14 MySQL
MySQL定时备份数据库(全库备份)的实现
Sep 25 MySQL
MySQL连接控制插件介绍
Sep 25 MySQL
MySQL创建定时任务
Jan 22 MySQL
CentOS 7安装mysql5.7使用XtraBackUp备份工具命令详解
Apr 12 MySQL
MySQ InnoDB和MyISAM存储引擎介绍
Apr 26 MySQL
SQLServer常见数学函数梳理总结
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 UTF8编码内的繁简转换类
2009/07/20 PHP
PHP+Mysql+jQuery实现发布微博程序 jQuery篇
2011/10/08 PHP
使用PHP导出Word文档的原理和实例
2013/10/21 PHP
PHP图片等比缩放类SimpleImage使用方法和使用实例分享
2014/04/10 PHP
PHP实现多图片上传类实例
2014/07/26 PHP
php图形jpgraph操作实例分析
2017/02/22 PHP
PHP递归算法的简单实例
2019/02/28 PHP
网页源代码保护(禁止右键、复制、另存为、查看源文件)
2012/05/23 Javascript
js汉字转拼音实现代码
2013/02/06 Javascript
javascript 得到文件后缀名的思路及实现
2020/05/09 Javascript
javascript中的Function.prototye.bind
2015/06/25 Javascript
jQuery form插件之formDdata参数校验表单及验证后提交
2016/01/23 Javascript
javascript创建对象的3种方法
2016/11/02 Javascript
原生Javascript插件开发实践
2017/01/18 Javascript
React Native预设占位placeholder的使用
2017/09/28 Javascript
微信小程序自动客服功能
2017/11/02 Javascript
vue打包之后生成一个配置文件修改接口的方法
2018/12/09 Javascript
layui的面包屑或者表单不显示的解决方法
2019/09/05 Javascript
vue实现图片懒加载的方法分析
2020/02/05 Javascript
[02:47]DOTA2亚洲邀请赛 HR战队出场宣传片
2015/02/07 DOTA
[01:45]典藏宝瓶2+祈求者身心——这就是DOTA2TI9总奖金突破3000万美元的秘密
2019/07/21 DOTA
[01:16:13]DOTA2-DPC中国联赛 正赛 SAG vs Dragon BO3 第一场 2月22日
2021/03/11 DOTA
python处理csv数据动态显示曲线实例代码
2018/01/23 Python
Python连接Mssql基础教程之Python库pymssql
2018/09/16 Python
pyqt5 实现在别的窗口弹出进度条
2019/06/18 Python
Django组件content-type使用方法详解
2019/07/19 Python
Python3基本输入与输出操作实例分析
2020/02/14 Python
python安装和pycharm环境搭建设置方法
2020/05/27 Python
在keras 中获取张量 tensor 的维度大小实例
2020/06/10 Python
世界排名第一的万圣节服装店:Spirit Halloween
2018/10/16 全球购物
西雅图电动自行车公司:Rad Power Bikes
2020/02/02 全球购物
酒店工程部主管岗位职责
2015/04/16 职场文书
无保留意见审计报告
2015/06/05 职场文书
每日六道java新手入门面试题,通往自由的道路
2021/06/30 Java/Android
netty 实现tomcat的示例代码
2022/06/05 Servers
Python 操作pdf pdfplumber读取PDF写入Exce
2022/08/14 Python