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 相关文章推荐
浅析InnoDB索引结构
Apr 05 MySQL
MySQL Innodb关键特性之插入缓冲(insert buffer)
Apr 08 MySQL
MySQL获取所有分类的前N条记录
May 07 MySQL
浅谈MySQL 亿级数据分页的优化
Jun 15 MySQL
mysql连接查询中and与where的区别浅析
Jul 01 MySQL
MySQL中的隐藏列的具体查看
Sep 04 MySQL
VS2019连接MySQL数据库的过程及常见问题总结
Nov 27 MySQL
Mysql忘记密码解决方法
Feb 12 MySQL
SQL注入篇学习之盲注/宽字节注入
Mar 03 MySQL
MySQL示例讲解数据库约束以及表的设计
Jun 16 MySQL
MySQL transaction事务安全示例讲解
Jun 21 MySQL
postgresql如何找到表中重复数据的行并删除
May 08 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正则校验用户名介绍
2008/07/19 PHP
php db类库进行数据库操作
2009/03/19 PHP
php牛逼的面试题分享
2013/01/18 PHP
PHP获取页面执行时间的方法(推荐)
2016/12/10 PHP
php封装db类连接sqlite3数据库的方法实例
2017/12/19 PHP
PHP7.1实现的AES与RSA加密操作示例
2018/06/15 PHP
aspx中利用js实现确认删除代码
2010/07/22 Javascript
JQuery datepicker 使用方法
2011/05/20 Javascript
jquery实现的鼠标下拉滚动置顶效果
2014/07/24 Javascript
轻松创建nodejs服务器(10):处理POST请求
2014/12/18 NodeJs
jQuery中find()方法用法实例
2015/01/07 Javascript
jquery Easyui快速开发总结
2015/08/20 Javascript
再谈JavaScript异步编程
2016/01/27 Javascript
JavaScript基于对象去除数组重复项的方法
2016/10/09 Javascript
详解angularJs模块ui-router之状态嵌套和视图嵌套
2017/04/28 Javascript
JavaScript程序设计高级算法之动态规划实例分析
2017/11/24 Javascript
vue用Object.defineProperty手写一个简单的双向绑定的示例
2018/07/09 Javascript
Vue2.x中利用@font-size引入字体图标报错的解决方法
2018/09/28 Javascript
Angular刷新当前页面的实现方法
2018/11/21 Javascript
vue实现页面滚动到底部刷新
2019/08/16 Javascript
使用webpack/gulp构建TypeScript项目的方法示例
2019/12/18 Javascript
[02:57]DOTA2亚洲邀请赛 SECRET战队出场宣传片
2015/02/07 DOTA
python去除所有html标签的方法
2015/05/05 Python
windows10下python3.5 pip3安装图文教程
2018/04/02 Python
在Python函数中输入任意数量参数的实例
2019/07/16 Python
python中remove函数的踩坑记录
2021/01/04 Python
Linux如何压缩可执行文件
2013/10/21 面试题
【魔兽争霸3重制版】原版画面与淬火MOD画面对比
2021/03/26 魔兽争霸
师范生实习自我鉴定
2013/11/01 职场文书
大学生自助营养快餐店创业计划书
2014/01/13 职场文书
新学期标语
2014/06/30 职场文书
银行求职自荐信
2014/06/30 职场文书
教学改革问题查摆整改措施
2014/09/27 职场文书
Python 如何将integer转化为罗马数(3999以内)
2021/06/05 Python
Logback 使用TurboFilter实现日志级别等内容的动态修改操作
2021/08/30 Java/Android
Android开发之WECHAT微信小程序路由跳转的两种形式
2022/04/12 Java/Android