MySQL实现批量插入测试数据的方式总结

在开发过程中经常需要一些测试数据, 这个时候如果手敲的话, 十行二十行还好, 多了就很死亡了, 接下来介绍两种常用的MySQL测试数据批量生成方式,希望对大家有所帮助

前言

在开发过程中我们不管是用来测试性能还是在生产环境中页面展示好看一点, 又或者学习验证某一知识点经常需要一些测试数据, 这个时候如果手敲的话, 十行二十行还好, 多了就很死亡了, 接下来介绍两种常用的MySQL测试数据批量生成方式

  • 存储方式+函数
  • Navicat的数据生成

准备了两张表 角色表:

  • id: 自增长
  • role_name: 随机字符串, 不允许重复
  • orders: 1-1000任意数字

用户表:

  • id: 自增长
  • username: 随机字符串, 不允许重复
  • password: 随机字符串, 允许重复
  • role_id: 1-10w之间的任意数字

建表语句:

sql

复制代码

CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(255) DEFAULT NULL COMMENT '用户名', `role_id` int(11) DEFAULT NULL COMMENT '角色id', `password` varchar(255) DEFAULT NULL COMMENT '密码', `salt` varchar(255) DEFAULT NULL COMMENT '盐', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; CREATE TABLE `role` ( `id` int(11) NOT NULL AUTO_INCREMENT, `role_name` varchar(255) DEFAULT NULL COMMENT '角色名', `orders` int(11) DEFAULT NULL COMMENT '排序权重\r\n', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1;

使用函数生成

通过存储过程快速插入, 通过函数保证数据不重复

设置允许创建函数

查看 MySQL是否允许创建函数

sql

复制代码

SHOW VARIABLES LIKE 'log_bin_trust_function_creators';

image.png-600

结果如图所示, 我们使用以下命令将创建函数功能打开(global-所有session都生效)

sql

复制代码

SET GLOBAL log_bin_trust_function_creators=1;

image.png-600

这个时候再一次查询就会显示已打开

image.png-600

产生随机字符串

sql

复制代码

-- 随机产生字符串 DELIMITER $$ CREATE FUNCTION rand_string(n INT) RETURNS VARCHAR(255) BEGIN DECLARE chars_str VARCHAR(100) DEFAULT 'abcdefghijklmnopqrstuvwxyzABCDEFJHIJKLMNOPQRSTUVWXYZ'; DECLARE return_str VARCHAR(255) DEFAULT ''; DECLARE i INT DEFAULT 0; WHILE i

产生随机数字

sql

复制代码

-- 用于随机产生区间数字 DELIMITER $$ CREATE FUNCTION rand_num (from_num INT ,to_num INT) RETURNS INT(11) BEGIN DECLARE i INT DEFAULT 0; SET i = FLOOR(from_num +RAND()*(to_num -from_num+1)); RETURN i; END$$ -- 假如要删除 -- drop function rand_num;

创建存储过程

插入角色表

sql

复制代码

-- 插入角色数据 DELIMITER $$ CREATE PROCEDURE insert_role(max_num INT) BEGIN DECLARE i INT DEFAULT 0; SET autocommit = 0; REPEAT SET i = i + 1; INSERT INTO role ( role_name,orders ) VALUES (rand_string(8),rand_num(1,5000)); UNTIL i = max_num END REPEAT; COMMIT; END$$ -- 删除 -- DELIMITER ; -- drop PROCEDURE insert_role;

插入用户表

sql

复制代码

-- 插入用户数据 DELIMITER $$ CREATE PROCEDURE insert_user(START INT, max_num INT) BEGIN DECLARE i INT DEFAULT 0; SET autocommit = 0; REPEAT SET i = i + 1; INSERT INTO user (username, role_id, password, salt ) VALUES (rand_string(8) ,rand_num(1,100000), rand_string(10), rand_string(10)); UNTIL i = max_num END REPEAT; COMMIT; END$$ -- 删除 -- DELIMITER ; -- drop PROCEDURE insert_user;

执行存储过程

sql

复制代码

-- 执行存储过程,往dept表添加10万条数据 CALL insert_role(100000); -- 执行存储过程,往emp表添加100万条数据,编号从100000开始 CALL insert_user(100000,1100000);

总结

执行用时 10w数据差不多半分钟, 100w数据超过了20分钟, 同时 user的存储还卡死很久...

最后都成功新增, 但是自动递增值和行数不一致, 这个我也不知道因为啥...

image.png-600

数据展示

  • role表 image.png-600

  • user表

image.png-600

使用 Navicat自带的数据生成

接下来我们使用 Navicat的数据生成

image.png-600

image.png-600

直接下一步, 然后选择对应的两张表生成行数和对应的生成规则, 基于之前的执行速度, 这次 role生成 1w数据, user生成 10w数据

对于字符串类型的字段, 我们可以设置他的随机数据生成器, 根据需要进行选择

image.png-600

例如角色名称, 选择了 职位名称 还可以进行是否包含 null 的选择等

image.png-600

但是如果是 姓名 那么就会让你选择是否唯一

image.png-600

数字的话会让你选择范围, 默认值等

image.png-600

等确定好了, 我们就可以点击右下角进行生成随机测试数据

image.png-600

通过结果可以看到生成十一万测试数据一共用时十一秒, 比第一种方法速度快很多, 推荐使用

到此这篇关于MySQL实现批量插入测试数据的方式总结的文章就介绍到这了,更多相关MySQL插入数据内容请搜索0133技术站以前的文章或继续浏览下面的相关文章希望大家以后多多支持0133技术站!

以上就是MySQL实现批量插入测试数据的方式总结的详细内容,更多请关注0133技术站其它相关文章!

赞(0) 打赏
未经允许不得转载:0133技术站首页 » 数据库