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 05 MySQL
MySQL sql_mode修改不生效的原因及解决
May 07 MySQL
Mysql基础知识点汇总
May 26 MySQL
MySQL的安装与配置详细教程
Jun 26 MySQL
详细聊聊MySQL中慢SQL优化的方向
Aug 30 MySQL
Mysql忘记密码解决方法
Feb 12 MySQL
Mysql如何实现不存在则插入,存在则更新
Mar 25 MySQL
mysql使用instr达到in(字符串)的效果
Apr 03 MySQL
MySQL数据库优化之通过索引解决SQL性能问题
Apr 10 MySQL
MySQL库表太大怎么办? 数据库分库分表项目实践
Apr 11 MySQL
手把手带你彻底卸载MySQL数据库
Jun 14 MySQL
MySQL远程无法连接的一些常见原因总结
Sep 23 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实现的冒泡排序算法分享
2014/08/21 PHP
javascript 全等号运算符使用说明
2010/05/31 Javascript
jquery插件开发方法(初学者)
2012/02/03 Javascript
jquery cookie实现的简单换肤功能适合小网站
2013/08/25 Javascript
JavaScript AOP编程实例
2015/06/16 Javascript
javascript实现五星评价代码(源码下载)
2015/08/11 Javascript
jQuery实现验证年龄简单思路
2016/02/24 Javascript
jQuery EasyUI Tab 选项卡问题小结
2016/08/16 Javascript
jQuery css() 方法动态修改CSS属性
2016/09/25 Javascript
Vue制作Todo List网页
2017/04/26 Javascript
详解Vue2中组件间通信的解决全方案
2017/07/28 Javascript
node.js实现为PDF添加水印的示例代码
2018/12/05 Javascript
使用element-ui table expand展开行实现手风琴效果
2019/03/15 Javascript
解决vue-cli webpack打包开启Gzip 报错问题
2019/07/24 Javascript
node+multer实现图片上传的示例代码
2020/02/18 Javascript
使用vue打包进行云服务器上传的问题
2020/03/02 Javascript
vue 点击其他区域关闭自定义div操作
2020/07/17 Javascript
一篇文章带你搞懂Vue虚拟Dom与diff算法
2020/08/25 Javascript
vue 监听 Treeselect 选择项的改变操作
2020/08/31 Javascript
python处理圆角图片、圆形图片的例子
2014/04/25 Python
在Python中使用HTMLParser解析HTML的教程
2015/04/29 Python
itchat接口使用示例
2017/10/23 Python
flask中过滤器的使用详解
2018/08/01 Python
Python 利用邮件系统完成远程控制电脑的实现(关机、重启等)
2019/11/19 Python
Python接口开发实现步骤详解
2020/04/26 Python
pandas处理csv文件的方法步骤
2020/10/16 Python
浅析HTML5中header标签的用法
2016/06/24 HTML / CSS
美国儿童运动鞋和服装零售商:Kids Foot Locker
2017/08/05 全球购物
Superdry极度干燥美国官网:英国制造的服装品牌
2018/11/13 全球购物
工程资料员岗位职责
2014/03/10 职场文书
村长贪污检举信
2014/04/04 职场文书
离婚协议书的范本
2015/01/27 职场文书
幼儿教师辞职信范文
2015/03/02 职场文书
周一给客户的问候语
2015/11/10 职场文书
Win11 Dev 预览版25174.1000发布 (附更新修复内容汇总)
2022/08/05 数码科技
HTML5页面打开微信小程序功能实现
2022/09/23 HTML / CSS