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 06 MySQL
详解MySQL 用户权限管理
Apr 20 MySQL
详解MySQL 联合查询优化机制
May 10 MySQL
正确使用MySQL update语句
May 26 MySQL
Mysql systemctl start mysqld报错的问题解决
Jun 03 MySQL
解析MySQL binlog
Jun 11 MySQL
MySQL系列之十三 MySQL的复制
Jul 02 MySQL
MySQL中连接查询和子查询的问题
Sep 04 MySQL
MySQL面试题讲解之如何设置Hash索引
Nov 01 MySQL
MySQL 字符集 character
May 04 MySQL
深入理解MySQL中MVCC与BufferPool缓存机制
May 25 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程序运行时:Fatal error: Maximum execution time of 30 seconds exceeded in的错误提示
2016/11/25 PHP
JS去除字符串的空格增强版(可以去除中间的空格)
2009/08/26 Javascript
一段实现页面上的图片延时加载的js代码
2010/02/11 Javascript
javascript 获取页面的高度及滚动条的位置的代码
2010/05/06 Javascript
写js时遇到的一些小问题
2010/12/06 Javascript
读jQuery之二(两种扩展)
2011/06/11 Javascript
基于jquery的textarea发布框限制文字字数输入(添加中文识别)
2012/02/16 Javascript
javascript 常用功能总结
2012/03/18 Javascript
在JS数组特定索引处指定位置插入元素
2014/07/27 Javascript
jQuery实现公告新闻自动滚屏效果实例代码
2016/07/14 Javascript
jQuery EasyUI右键菜单实现关闭标签/选项卡
2016/10/10 Javascript
jQuery表单元素选择器代码实例
2017/02/06 Javascript
JS实现的简单四则运算计算器功能示例
2017/09/27 Javascript
如何优雅的在一台vps(云主机)上面部署vue+mongodb+express项目
2019/01/20 Javascript
JavaScript私有变量实例详解
2019/01/24 Javascript
基于elementUI使用v-model实现经纬度输入的vue组件
2019/05/12 Javascript
jQuery - AJAX load() 实例用法详解
2019/08/27 jQuery
微信小程序自定义navigationBar顶部导航栏适配所有机型(附完整案例)
2020/04/26 Javascript
Vue的自定义组件不能使用click方法的解决
2020/07/28 Javascript
下载安装setuptool和pip linux安装pip    
2014/01/24 Python
编写Python脚本把sqlAlchemy对象转换成dict的教程
2015/05/29 Python
详解pandas获取Dataframe元素值的几种方法
2020/06/14 Python
英国领先的办公用品供应商:Viking
2016/08/01 全球购物
全球烹饪课程的领先预订平台:Cookly
2020/01/28 全球购物
构造方法和其他方法的区别?怎么调用父类的构造方法
2013/09/22 面试题
入学生会自荐书范文
2014/02/05 职场文书
开学典礼决心书
2014/03/11 职场文书
计算机求职自荐信范文
2014/04/19 职场文书
本科生求职信
2014/06/17 职场文书
意外伤害赔偿协议书范本
2014/09/28 职场文书
2014年干部作风建设总结
2014/10/23 职场文书
酒店辞职书范文
2015/02/26 职场文书
2015年教学工作总结
2015/04/02 职场文书
教你怎么用Python处理excel实现自动化办公
2021/04/30 Python
Oracle 触发器trigger使用案例
2022/02/24 Oracle
如何用六步教会你使用python爬虫爬取数据
2022/04/06 Python