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 06 MySQL
mysql数据库入门第一步之创建表
May 14 MySQL
MySQL 重命名表的操作方法及注意事项
May 21 MySQL
MySQL中使用or、in与union all在查询命令下的效率对比
May 26 MySQL
MySQL 外键约束和表关系相关总结
Jun 20 MySQL
MySQL快速插入一亿测试数据
Jun 23 MySQL
基于MySql验证的vsftpd虚拟用户
Nov 07 MySQL
SQL 聚合、分组和排序
Nov 11 MySQL
VS2019连接MySQL数据库的过程及常见问题总结
Nov 27 MySQL
Mysql分析设计表主键为何不用uuid
Mar 31 MySQL
mysql sock 文件解析及作用讲解
Jul 15 MySQL
MySQL中dd::columns表结构转table过程及应用详解
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的安全
2006/10/09 PHP
谈谈PHP的输入输出流
2007/02/14 PHP
php分页函数完整实例代码
2014/09/22 PHP
JMenuTab简单使用说明
2008/03/13 Javascript
JavaScript 事件的一些重要说明
2009/10/25 Javascript
Javascript 面向对象 对象(Object)
2010/05/13 Javascript
{}与function(){}选用空对象{}来存放keyValue
2012/05/23 Javascript
Javasipt:操作radio标签详解
2013/12/30 Javascript
js点击出现悬浮窗效果不使用JQuery插件
2014/01/20 Javascript
jQuery获取URL请求参数的方法
2015/07/18 Javascript
js下将金额数字每三位一逗号分隔
2016/02/19 Javascript
JavaScript中transform实现数字翻页效果
2017/03/08 Javascript
使用JavaScript实现alert的实例代码
2017/07/06 Javascript
nodejs简单实现TCP服务器端和客户端的聊天功能示例
2018/01/04 NodeJs
ES6关于Promise的用法详解
2018/05/07 Javascript
详解vue中使用微信jssdk
2019/04/19 Javascript
CKEditor 4.4.1 添加代码高亮显示插件功能教程【使用官方推荐Code Snippet插件】
2019/06/14 Javascript
JS实现简易留言板(节点操作)
2020/03/16 Javascript
vue中全局路由守卫中替代this操作(this.$store/this.$vux)
2020/07/24 Javascript
python新手经常遇到的17个错误分析
2014/07/30 Python
以911新闻为例演示Python实现数据可视化的教程
2015/04/23 Python
简单了解python gevent 协程使用及作用
2019/07/22 Python
python面向对象 反射原理解析
2019/08/12 Python
python数据库编程 Mysql实现通讯录
2020/03/27 Python
Python如何输出整数
2020/06/07 Python
浅析Python requests 模块
2020/10/09 Python
python中time tzset()函数实例用法
2021/02/18 Python
伊莱克斯(Electrolux)俄罗斯网上商店:瑞典家用电器品牌
2021/01/23 全球购物
英语一分钟演讲稿
2014/04/29 职场文书
村党的群众路线教育实践活动工作总结
2014/10/25 职场文书
2015年公共机构节能宣传周活动总结
2015/03/26 职场文书
舌尖上的中国观后感
2015/06/02 职场文书
婚庆主持词大全
2015/06/30 职场文书
干部考核工作总结2015
2015/07/24 职场文书
Matlab如何实现矩阵复制扩充
2021/06/02 Python
javascript中Set、Map、WeakSet、WeakMap区别
2022/12/24 Javascript