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 相关文章推荐
数据库连接池
Apr 06 MySQL
mysql死锁和分库分表问题详解
Apr 16 MySQL
MySQL COUNT函数的使用与优化
May 10 MySQL
MySQL触发器的使用
May 24 MySQL
MySQL 如何设计统计数据表
Jun 15 MySQL
MySQL 亿级数据导入导出及迁移笔记
Jun 18 MySQL
使用ORM新增数据在Mysql中的操作步骤
Jul 26 MySQL
MySQL 主从复制数据不一致的解决方法
Mar 18 MySQL
MySQL实现配置主从复制项目实践
Mar 31 MySQL
MySQL批量更新不同表中的数据
May 11 MySQL
mysql sock 文件解析及作用讲解
Jul 15 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 preg_match_all结合str_replace替换内容中所有img
2008/10/11 PHP
shopex中集成的站长统计功能的代码简单分析
2011/08/11 PHP
百度工程师讲PHP函数的实现原理及性能分析(一)
2015/05/13 PHP
PHP mysqli事务操作常用方法分析
2017/07/22 PHP
PHP从零开始打造自己的MVC框架之入口文件实现方法详解
2019/06/03 PHP
Laravel 手动开关 Eloquent 修改器的操作方法
2019/12/30 PHP
jQuery 使用手册(六)
2009/09/23 Javascript
Javascript 网页水印(非图片水印)实现代码
2010/03/01 Javascript
js冒泡、捕获事件及阻止冒泡方法详细总结
2014/05/08 Javascript
JavaScript中双叹号!!作用示例介绍
2014/09/21 Javascript
AngularJs学习第五篇从Controller控制器谈谈$scope作用域
2016/06/08 Javascript
jquery siblings获取同辈元素用法实例分析
2016/07/25 Javascript
JavaScript面向对象编写购物车功能
2016/08/19 Javascript
微信小程序 css使用技巧总结
2017/01/09 Javascript
详解使用grunt完成requirejs的合并压缩和js文件的版本控制
2017/03/02 Javascript
JS沙箱模式实例分析
2017/09/04 Javascript
JavaScript中引用vs复制示例详析
2018/12/06 Javascript
微信小程序实现的canvas合成图片功能示例
2019/05/03 Javascript
JS实现返回上一页并刷新页面的方法分析
2019/07/16 Javascript
JavaScript Window窗口对象属性和使用方法
2020/01/19 Javascript
JavaScript装饰者模式原理与用法实例详解
2020/03/09 Javascript
[01:04:14]VP vs TNC 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
Cython 三分钟入门教程
2009/09/17 Python
Python面向对象实现一个对象调用另一个对象操作示例
2019/04/08 Python
Django使用Celery加redis执行异步任务的实例内容
2020/02/20 Python
Python求区间正整数内所有素数之和的方法实例
2020/10/13 Python
python3 通过 pybind11 使用Eigen加速代码的步骤详解
2020/12/07 Python
怎样客观的做好自我评价
2013/12/28 职场文书
自我评价格式
2014/01/06 职场文书
解除同居协议书
2015/01/29 职场文书
义诊活动总结
2015/02/04 职场文书
2015年八一建军节演讲稿
2015/03/19 职场文书
催款函范本大全
2015/06/24 职场文书
2019年图书室自查报告范本
2019/10/12 职场文书
Python实战之用tkinter库做一个鼠标模拟点击器
2021/04/27 Python
详解在OpenCV中如何使用图像像素
2022/03/03 Python