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中的主键与事务
May 27 MySQL
MySQL5.7并行复制原理及实现
Jun 03 MySQL
MySQL中utf8mb4排序规则示例
Aug 02 MySQL
Mysql实现简易版搜索引擎的示例代码
Aug 30 MySQL
MySQL Innodb索引机制详细介绍
Nov 23 MySQL
WINDOWS下安装mysql 8.x 的方法图文教程
Apr 19 MySQL
MYSQL中文乱码问题的解决方案
Jun 14 MySQL
MySQL8.0 Undo Tablespace管理详解
Jun 16 MySQL
MySQL数据库实验实现简单数据库应用系统设计
Jun 21 MySQL
MySQL提升大量数据查询效率的优化神器
Jul 07 MySQL
Mysql数据库group by原理详解
Jul 07 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 class中public,private,protected的区别以及实例分析
2013/06/18 PHP
一个显示效果非常不错的PHP错误、异常处理类
2014/03/21 PHP
9条PHP编程小知识及易犯的小错误
2015/01/22 PHP
PHP如何搭建百度Ueditor富文本编辑器
2018/09/21 PHP
PHP封装的page分页类定义与用法完整示例
2018/12/24 PHP
解决laravel上传图片之后,目录有图片,但是访问不到(404)的问题
2019/10/14 PHP
Thinkphp 框架扩展之数据库驱动常用方法小结
2020/04/23 PHP
extJS中常用的4种Ajax异步提交方式
2014/03/07 Javascript
Javascript模块化编程详解
2014/12/01 Javascript
深入浅析Extjs中store分组功能的使用方法
2016/04/20 Javascript
用js动态添加html元素,以及属性的简单实例
2016/07/19 Javascript
JS Canvas定时器模拟动态加载动画
2016/09/17 Javascript
javascript数组去重方法分析
2016/12/15 Javascript
bootstrap 下拉多选框进行多选传值问题代码分析
2017/02/14 Javascript
Bootstrap缩略图的创建方法
2017/03/22 Javascript
Webpack实现按需打包Lodash的几种方法详解
2017/05/08 Javascript
CentOS 安装NodeJS V8.0.0的方法
2017/06/15 NodeJs
深入理解基于vue-cli的vuex配置
2017/07/24 Javascript
详解vue中在循环中使用@mouseenter 和 @mouseleave事件闪烁问题解决方法
2020/04/07 Javascript
[04:03]DOTA2英雄梦之声_第02期_风暴之灵
2014/06/30 DOTA
Python 迭代器工具包【推荐】
2016/05/06 Python
Python的re模块正则表达式操作
2016/05/25 Python
对Python正则匹配IP、Url、Mail的方法详解
2018/12/25 Python
python批量爬取下载抖音视频
2019/06/17 Python
在django中,关于session的通用设置方法
2019/08/06 Python
Django调用支付宝接口代码实例详解
2020/04/04 Python
html5在移动端的屏幕适应问题示例探讨
2014/06/15 HTML / CSS
法国设计制造的扫帚和刷子:Andrée Jardin
2018/12/06 全球购物
印度尼西亚最好的小工具在线商店:Erafone.com
2019/03/26 全球购物
澳大利亚窗帘商店:Curtain Wonderland
2019/12/01 全球购物
迷你西餐厅创业计划书范文
2013/12/31 职场文书
班长自荐书范文
2014/02/11 职场文书
2014年关于两会精神的心得体会
2014/03/17 职场文书
小学教师评语大全
2014/04/23 职场文书
2015年学校少先队工作总结
2015/07/20 职场文书
pytorch实现手写数字图片识别
2021/05/20 Python