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基础知识点汇总
May 26 MySQL
MySQL8.0的WITH查询详情
Aug 30 MySQL
详细聊聊MySQL中慢SQL优化的方向
Aug 30 MySQL
解析MySQL索引的作用
Mar 03 MySQL
MySQL中一条update语句是如何执行的
Mar 16 MySQL
mysql查询结果实现多列拼接查询
Apr 03 MySQL
解决MySQL Varchar 类型尾部空格的问题
Apr 06 MySQL
mysql中如何用命令创建联合唯一索引
Apr 20 MySQL
MySQ InnoDB和MyISAM存储引擎介绍
Apr 26 MySQL
MySQL新手入门进阶语句汇总
Sep 23 MySQL
MySQL深分页问题解决思路
Dec 24 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实现维护文件代码
2007/06/14 PHP
浅析十款PHP开发框架的对比
2013/07/05 PHP
分享一段php获取linux服务器状态的代码
2014/05/27 PHP
深入理解PHP内核(一)
2015/11/10 PHP
php array_merge_recursive 数组合并
2016/10/26 PHP
thinkPHP批量删除的实现方法分析
2016/11/09 PHP
php数据序列化测试实例详解
2017/08/12 PHP
php解压缩zip和rar压缩包文件的方法
2019/07/10 PHP
在JavaScript中操作时间之getMonth()方法的使用
2015/06/10 Javascript
AngularJS 路由详解和简单实例
2016/07/28 Javascript
js实现的xml对象转json功能示例
2016/12/24 Javascript
js中数组的常用方法小结
2016/12/30 Javascript
代码详解JS操作剪贴板
2018/02/11 Javascript
详解Vue.js项目API、Router配置拆分实践
2018/03/16 Javascript
JS实现json对象数组按对象属性排序操作示例
2018/05/18 Javascript
浅谈JS对象添加getter与setter的5种方法
2018/06/09 Javascript
vue2.0 使用element-ui里的upload组件实现图片预览效果方法
2018/09/04 Javascript
JavaScript实现图片轮播特效
2019/10/23 Javascript
vue npm install 安装某个指定的版本操作
2020/08/11 Javascript
在Django框架中设置语言偏好的教程
2015/07/27 Python
Python基于pygame实现图片代替鼠标移动效果
2015/11/11 Python
python实现excel读写数据
2021/03/02 Python
Python改变对象的字符串显示的方法
2020/08/01 Python
Python存储读取HDF5文件代码解析
2020/11/25 Python
手把手教你用纯css3实现轮播图效果实例
2017/05/04 HTML / CSS
Spartoo葡萄牙鞋类网站:线上销售鞋履与时尚配饰
2017/01/11 全球购物
美国半成品食材配送服务商:Home Chef
2018/01/25 全球购物
立志成才演讲稿
2014/09/04 职场文书
2015年学校图书室工作总结
2015/05/19 职场文书
理想国读书笔记
2015/06/25 职场文书
班级元旦晚会开幕词
2016/03/04 职场文书
MySQL 重写查询语句的三种策略
2021/05/10 MySQL
浅谈MySQL中的六种日志
2022/03/23 MySQL
在NumPy中深拷贝和浅拷贝相关操作的定义和背后的原理
2022/04/14 Python
5个pandas调用函数的方法让数据处理更加灵活自如
2022/04/24 Python
JavaScript架构localStorage特殊场景下二次封装操作
2022/06/21 Javascript