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 数据丢失排查案例
May 08 MySQL
MySQL 常见的数据表设计误区汇总
Jun 07 MySQL
MySQL约束超详解
Sep 04 MySQL
MySQL表类型 存储引擎 的选择
Nov 11 MySQL
mysql中整数数据类型tinyint详解
Dec 06 MySQL
MySQL RC事务隔离的实现
Mar 31 MySQL
Windows 64位 安装 mysql 8.0.28 图文教程
Apr 19 MySQL
Mysql 数据库中的 redo log 和 binlog 写入策略
Apr 26 MySQL
mysql 排序失效
May 20 MySQL
MySQL数据库查询之多表查询总结
Aug 05 MySQL
MySQL数据管理操作示例讲解
Dec 24 MySQL
详解MySQL的内连接和外连接
May 08 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
日本收入最高的漫画家:海贼王作者版税年收入高达8.45亿元
2020/03/04 日漫
PHP语法速查表
2006/12/06 PHP
php微信公众号开发(4)php实现自定义关键字回复
2016/12/15 PHP
PHP实现截取中文字符串不出现?号的解决方法
2016/12/29 PHP
PHP计算近1年的所有月份
2017/03/13 PHP
jQuery与ExtJS之选择实例分析
2010/08/19 Javascript
EasyUI实现二级页面的内容勾选的方法
2015/03/01 Javascript
jquery实现鼠标滑过小图查看大图的方法
2015/07/20 Javascript
AngularJS数据源的多种获取方式汇总
2016/02/02 Javascript
jquery实现左右无缝轮播图
2020/07/31 Javascript
nodejs微信公众号支付开发
2016/09/19 NodeJs
JS仿QQ好友列表展开、收缩功能(第二篇)
2017/07/07 Javascript
Angular6 正则表达式允许输入部分中文字符
2018/09/10 Javascript
nodejs初始化init的示例代码
2018/10/10 NodeJs
vue 使用vue-i18n做全局中英文切换的方法
2018/10/29 Javascript
JavaScript面试技巧之数组的一些不low操作
2019/03/22 Javascript
nodejs脚本centos开机启动实操方法
2020/03/04 NodeJs
JS简易计算器实例讲解
2020/06/30 Javascript
Python 元组(Tuple)操作详解
2014/03/11 Python
解决出现Incorrect integer value: '' for column 'id' at row 1的问题
2017/10/29 Python
python好玩的项目—色情图片识别代码分享
2017/11/07 Python
python return逻辑判断表达式实现解析
2019/12/02 Python
Python3.x+迅雷x 自动下载高分电影的实现方法
2020/01/12 Python
Python3 读取Word文件方式
2020/02/13 Python
新英格兰最大的特色礼品连锁店:The Paper Store
2018/07/23 全球购物
联想印度官方网上商店:Lenovo India
2019/08/24 全球购物
澳大利亚在线奢侈品时尚零售平台:Azura Runway
2021/01/13 全球购物
英国豪华家具和经典家居饰品购物网站:OKA
2020/06/05 全球购物
应用服务器有那些
2012/01/19 面试题
秋天的图画教学反思
2014/05/01 职场文书
学校课外活动总结
2014/05/08 职场文书
导游欢送词
2015/01/31 职场文书
唐山大地震观后感
2015/06/05 职场文书
卢旺达饭店观后感
2015/06/05 职场文书
企业财务管理制度范本
2015/08/04 职场文书
html粘性页脚的具体使用
2022/01/18 HTML / CSS