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 Router的安装部署
Apr 24 MySQL
详解MySQL连接挂死的原因
May 18 MySQL
分析MySQL抛出异常的几种常见解决方式
May 18 MySQL
MYSQL主从数据库同步备份配置的方法
May 26 MySQL
Mysql 设置boolean类型的操作
Jun 04 MySQL
MySQL悲观锁与乐观锁的实现方案
Nov 02 MySQL
详解MySQL的主键查询为什么这么快
Apr 03 MySQL
详细聊一聊mysql的树形结构存储以及查询
Apr 05 MySQL
Mysql开启外网访问
May 15 MySQL
sql查询语句之平均分、最高最低分及排序语句
May 30 MySQL
MySQL数据库安装方法与图形化管理工具介绍
May 30 MySQL
MySQL导致索引失效的几种情况
Jun 25 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之header的不同用法总结(实例讲解)
2017/11/28 PHP
php中html_entity_decode实现HTML实体转义
2018/06/13 PHP
Javascript 定时器调用传递参数的方法
2009/11/12 Javascript
JS字符串拼接在ie中都报错的解决方法
2014/03/27 Javascript
jQuery图片切换插件jquery.cycle.js使用示例
2014/06/16 Javascript
js获取页面传来参数的方法
2014/09/06 Javascript
javascript版2048小游戏
2015/03/18 Javascript
JavaScript获取网页表单action属性的方法
2015/04/02 Javascript
JavaScript让网页出现渐隐渐显背景颜色的方法
2015/04/21 Javascript
微信小程序 navigation API实例详解
2016/10/02 Javascript
jquery ajax后台返回list,前台用jquery遍历list的实现
2016/10/30 Javascript
Vue表单验证插件Vue Validator使用方法详解
2017/04/07 Javascript
BootstrapTable加载按钮功能实例代码详解
2017/09/22 Javascript
浅谈vue中组件绑定事件时是否加.native
2019/11/09 Javascript
JS实现音乐导航特效
2020/01/06 Javascript
通过实例了解Render Props回调地狱解决方案
2020/11/04 Javascript
[03:53]2016国际邀请赛中国区预选赛第三日TOP10精彩集锦
2016/06/29 DOTA
Python中运行并行任务技巧
2015/02/26 Python
动感网页相册 python编写简单文件夹内图片浏览工具
2016/08/17 Python
python实现简单登陆流程的方法
2018/04/22 Python
Python3单行定义多个变量或赋值方法
2018/07/12 Python
Python字符串的一些操作方法总结
2019/06/10 Python
Django实现文件上传下载功能
2019/10/06 Python
python MD5加密的示例
2020/10/19 Python
Python如何批量生成和调用变量
2020/11/21 Python
python 视频下载神器(you-get)的具体使用
2021/01/06 Python
ECCO爱步加拿大官网:北欧丹麦鞋履及皮具品牌
2017/07/08 全球购物
销售自我评价
2013/10/22 职场文书
学校2015年纠风工作总结
2015/05/15 职场文书
走进毛泽东观后感
2015/06/04 职场文书
党员读书活动心得体会
2016/01/14 职场文书
pytorch 中autograd.grad()函数的用法说明
2021/05/12 Python
Python爬虫之自动爬取某车之家各车销售数据
2021/06/02 Python
Java面试题冲刺第十七天--基础篇3
2021/08/07 面试题
使用redis生成唯一编号及原理示例详解
2021/09/15 Redis
spring 项目实现限流方法示例
2022/07/15 Java/Android