MySQL批量插入测试数据的2种方式

1978 篇文章 51 订阅
752 篇文章 1 订阅

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

  • 存储方式+函数

  • Navicat的数据生成

准备了两张表。

角色表:

  • id: 自增长

  • role_name: 随机字符串, 不允许重复

  • orders: 1-1000任意数字

用户表:

  • id: 自增长

  • username: 随机字符串, 不允许重复

  • password: 随机字符串, 允许重复

  • role_id: 1-10w之间的任意数字

建表语句:

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;

使用函数生成

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

01 设置允许创建函数

查看 MySQL是否允许创建函数:

SHOW VARIABLES LIKE 'log_bin_trust_function_creators';

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

SET GLOBAL log_bin_trust_function_creators=1; 

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

产生随机字符串:

-- 随机产生字符串
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 < 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;

产生随机数字:​​​​​​​

-- 用于随机产生区间数字
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;

02 创建存储过程

插入角色表:​​​​​​​

-- 插入角色数据
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;

插入用户表:​​​​​​​

-- 插入用户数据
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;

03 执行存储过程​​​​​​​

-- 执行存储过程,往dept表添加10万条数据
CALL insert_role(100000); 

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

总结

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

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

数据展示:

  • role表

  • user表

使用Navicat自带的数据生成

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

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

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

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

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

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

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

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

最后:下方这份完整的软件测试视频教程已经整理上传完成,需要的朋友们可以自行领取【保证100%免费】

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值