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令人咋舌的隐式转换
Apr 05 MySQL
MySQL infobright的安装步骤
Apr 07 MySQL
MySQL的join buffer原理
Apr 29 MySQL
MySQL 存储过程的优缺点分析
May 20 MySQL
MySQL中distinct和count(*)的使用方法比较
May 26 MySQL
MySQL库表名大小写的选择
Jun 05 MySQL
MySQL连表查询分组去重的实现示例
Jul 01 MySQL
MySQL图形化管理工具Navicat安装步骤
Dec 04 MySQL
mysql中数据库覆盖导入的几种方式总结
Mar 25 MySQL
MySQL实现配置主从复制项目实践
Mar 31 MySQL
Golang连接并操作MySQL
Apr 14 MySQL
浅谈MySql update会锁定哪些范围的数据
Jun 25 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正则的Unknown Modifier错误解决方法
2010/03/02 PHP
PHP实现的统计数据功能详解
2016/12/06 PHP
关于php几种字符串连接的效率比较(详解)
2017/02/22 PHP
使用composer命令加载vendor中的第三方类库 的方法
2019/07/09 PHP
异步javascript的原理和实现技巧介绍
2012/11/08 Javascript
jQuery图片滚动图片的效果(另类实现)
2013/06/02 Javascript
浅谈JavaScript之事件绑定
2013/07/08 Javascript
Backbone.js 0.9.2 源码注释中文翻译版
2015/06/25 Javascript
JavaScript获取并更改input标签name属性的方法
2015/07/02 Javascript
javascript实现平滑无缝滚动
2020/08/09 Javascript
jQuery事件用法详解
2016/10/06 Javascript
js实现鼠标左右移动,图片也跟着移动效果
2017/01/25 Javascript
vue使用video.js进行视频播放功能
2019/07/18 Javascript
Vue项目中使用WebUploader实现文件上传的方法
2019/07/21 Javascript
vue+elementUi图片上传组件使用详解
2019/08/20 Javascript
js使用文档就绪函数动态改变页面内容示例【innerHTML、innerText】
2019/11/07 Javascript
vue路由拦截器和请求拦截器知识点总结
2019/11/08 Javascript
js 数组当前行添加数据方法详解
2020/07/28 Javascript
Vue+ElementUI 中级联选择器Bug问题的解决
2020/07/31 Javascript
[02:08]什么藏在DOTA2 TI9“小紫本”里?斧王历险记告诉你!
2019/05/17 DOTA
使用Python下载Bing图片(代码)
2013/11/07 Python
python实现mysql的读写分离及负载均衡
2018/02/04 Python
Python实现SQL注入检测插件实例代码
2019/02/02 Python
Python英文文章词频统计(14份剑桥真题词频统计)
2019/10/13 Python
Python绘制全球疫情变化地图的实例代码
2020/04/20 Python
python 利用jieba.analyse进行 关键词提取
2020/12/17 Python
HTML5 manifest离线缓存的示例代码
2018/08/08 HTML / CSS
时尚孕妇装:Ingrid & Isabel
2019/05/08 全球购物
Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?
2014/07/27 面试题
《王二小》教学反思
2014/02/27 职场文书
农民工预备党员思想汇报
2014/09/14 职场文书
国家领导干部党的群众路线教育实践活动批评与自我批评材料
2014/09/23 职场文书
孕妇离婚协议书范本
2014/11/20 职场文书
2014年园林绿化工作总结
2014/12/11 职场文书
党员进社区活动总结
2015/05/07 职场文书
基于JavaScript实现年月日三级联动
2021/06/22 Javascript