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 相关文章推荐
多表查询、事务、DCL
Apr 05 MySQL
MySQL慢查询的坑
Apr 28 MySQL
MySQL 自定义变量的概念及特点
May 13 MySQL
MySQL中distinct和count(*)的使用方法比较
May 26 MySQL
MySQL系列之六 用户与授权
Jul 02 MySQL
MySQL高级进阶sql语句总结大全
Mar 16 MySQL
MySQL中一条SQL查询语句是如何执行的
Apr 08 MySQL
MySql分区类型及创建分区的方法
Apr 13 MySQL
Mysql 一主多从的部署
May 20 MySQL
MySQL数据库实验之 触发器和存储过程
Jun 21 MySQL
MySQL事务的ACID特性以及并发问题方案
Jul 15 MySQL
Mysql中mvcc各场景理解应用
Aug 05 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代码
2007/03/03 PHP
PHP学习 运算符与运算符优先级
2008/06/15 PHP
php 处理上百万条的数据库如何提高处理查询速度
2010/02/08 PHP
php分页函数示例代码分享
2014/02/24 PHP
php 表单提交大量数据发生丢失的解决方法
2014/03/03 PHP
php连接MSsql server的五种方法总结
2018/03/04 PHP
Laravel学习笔记之Artisan命令生成自定义模板的方法
2018/11/22 PHP
Dom 结点创建 基础知识
2011/10/01 Javascript
Node.js DES加密的简单实现
2016/07/07 Javascript
node网页分段渲染详解
2016/09/05 Javascript
AngularJS框架中的双向数据绑定机制详解【减少需要重复的开发代码量】
2017/01/19 Javascript
vue-router 中router-view不能渲染的解决方法
2017/05/23 Javascript
vue拦截器实现统一token,并兼容IE9验证功能
2018/04/26 Javascript
详解创建自定义的Angular Schematics
2018/06/06 Javascript
微信小程序的注册页面包含倒计时验证码、获取用户信息
2019/05/22 Javascript
vue-cli 为项目设置别名的方法
2019/10/15 Javascript
JavaScript对象原型链原理解析
2020/01/22 Javascript
在vue项目实现一个ctrl+f的搜索功能
2020/02/28 Javascript
Python中的并发编程实例
2014/07/07 Python
解决python2.7用pip安装包时出现错误的问题
2017/01/23 Python
Python复数属性和方法运算操作示例
2017/07/21 Python
python处理csv数据动态显示曲线实例代码
2018/01/23 Python
PyQt4实现下拉菜单可供选择并打印出来
2018/04/20 Python
好的Python培训机构应该具备哪些条件
2018/05/23 Python
Python实现全排列的打印
2018/08/18 Python
Python3.5面向对象与继承图文实例详解
2019/04/24 Python
Python button选取本地图片并显示的实例
2019/06/13 Python
PowerBI和Python关于数据分析的对比
2019/07/11 Python
python将dict中的unicode打印成中文实例
2020/05/11 Python
Python基于smtplib协议实现发送邮件
2020/06/03 Python
python操作链表的示例代码
2020/09/27 Python
Sperry官网:帆船鞋创始品牌
2016/09/07 全球购物
英国在线药房和在线药剂师:Chemist 4 U
2020/01/05 全球购物
Cynthia Rowley官网:全球领先的生活方式品牌
2020/10/27 全球购物
实习生自我评价
2014/01/18 职场文书
DSP接收机前端设想
2022/04/05 无线电