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 Show Profile
Apr 05 MySQL
MySQL创建索引需要了解的
Apr 08 MySQL
分析MySQL抛出异常的几种常见解决方式
May 18 MySQL
MySQL 数据类型选择原则
May 27 MySQL
MySql 8.0及对应驱动包匹配的注意点说明
Jun 23 MySQL
MySql子查询IN的执行和优化的实现
Aug 02 MySQL
MySQL优化常用的19种有效方法(推荐!)
Mar 17 MySQL
MySQL 数据表操作
May 04 MySQL
SQLServer常见数学函数梳理总结
Aug 05 MySQL
MySQL存储过程及语法详解
Aug 05 MySQL
MySQL中LAG()函数和LEAD()函数的使用
Aug 14 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
thinkphp 手机号和用户名同时登录
2017/01/20 PHP
浅谈thinkphp5 instance 的简单实现
2017/07/30 PHP
PHP _construct()函数讲解
2019/02/03 PHP
php5与php7的区别点总结
2019/10/11 PHP
本地对象Array的原型扩展实现代码
2010/12/04 Javascript
jQuery使用removeClass方法删除元素指定Class的方法
2015/03/26 Javascript
jQuery实现可以控制图片旋转角度效果(附demo源码下载)
2016/01/27 Javascript
精通JavaScript的this关键字
2020/05/28 Javascript
jQuery解析与处理服务器端返回xml格式数据的方法详解
2016/07/04 Javascript
JavaScript版经典游戏之扫雷游戏完整示例【附demo源码下载】
2016/12/12 Javascript
vue axios登录请求拦截器
2018/04/02 Javascript
详解VueJs中的V-bind指令
2018/05/03 Javascript
node中间层实现文件上传功能
2018/06/11 Javascript
深入浅析var,let,const的异同点
2018/08/07 Javascript
Angular父子组件通过服务传参的示例方法
2018/10/31 Javascript
JavaScript常见事件处理程序实例总结
2019/01/05 Javascript
vue按需加载实例详解
2019/09/06 Javascript
js实现图片3D轮播效果
2019/09/21 Javascript
jquery弹窗时禁止body滚动条滚动的例子
2019/09/21 jQuery
基于JavaScript实现简单扫雷游戏
2021/01/02 Javascript
Python正则表达式匹配ip地址实例
2014/10/09 Python
在Python的Django框架中实现Hacker News的一些功能
2015/04/17 Python
python对url格式解析的方法
2015/05/13 Python
python利用datetime模块计算时间差
2015/08/04 Python
Python简单操作sqlite3的方法示例
2017/03/22 Python
python+selenium开发环境搭建图文教程
2017/08/11 Python
使用python编写udp协议的ping程序方法
2018/04/22 Python
Python上下文管理器用法及实例解析
2019/11/11 Python
基于python实现上传文件到OSS代码实例
2020/05/09 Python
python实现sm2和sm4国密(国家商用密码)算法的示例
2020/09/26 Python
先进党支部事迹材料
2014/01/13 职场文书
公司请假条格式
2014/04/11 职场文书
人民调解员先进事迹材料
2014/05/08 职场文书
整改通知书格式
2015/04/22 职场文书
律师催款函范文
2015/06/24 职场文书
Python代码实现双链表
2022/05/25 Python