MySql大批量生成测试数据

Posted 小妖云汐

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySql大批量生成测试数据相关的知识,希望对你有一定的参考价值。

mysql大批量生成测试数据


*以下sql均使用于 mysql5.7 和 mysql8.0 *

函数准备

随机生成某个范围内的数字

【创建SQL】

create function generateNum(min int,max int) returns int
begin
    return floor(min+rand()*(max+1));
END 

【使用SQL】

## 生成10-100之间的随机数
SELECT generateNum(10,91);

随机生成指定长度的英文字符串

【创建SQL】

set global log_bin_trust_function_creators=TRUE;
create function generateStr(n int) returns varchar(255)
begin
    declare chars_str  varchar(100) default 'abcdefghigklmnopqrstuvwxyzABCDEFGHIGKLMNOPQRSTUVWXYZ';
    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 

【使用SQL】

## 传参为指定字符串长度
select generateStr(5); 

随机生成中文名

【创建SQL】

## 使用时,所在数据的编码需要设置为utf8,涉及到的表也为utf8,编码格式保持一致
CREATE FUNCTION `generateName`() RETURNS varchar(255) CHARSET utf8 DETERMINISTIC
BEGIN -- 开始
  DECLARE xing VARCHAR (2056) DEFAULT '赵钱孙李周郑王冯陈楮卫蒋沈韩杨朱秦尤许何吕施张孔曹严华金魏陶姜谢喻柏水贺罗毕安常乐于黄和穆萧尹姚邵湛汪宋茅屈林胡丁陆荣'; -- 定义姓
  DECLARE ming VARCHAR (2056) DEFAULT '嘉轩烨伟苑博伟泽熠彤鸿煊博涛烨霖烨华煜祺智宸正豪昊然明杰诚立轩立辉峻熙弘文熠彤鸿煊烨霖哲瀚鑫鹏致远俊驰雨泽烨磊晟睿天佑文昊修洁黎昕远航旭尧鸿涛伟祺轩越泽浩宇瑾瑜皓轩擎苍擎宇志泽睿渊楷瑞轩弘文哲瀚雨泽鑫磊梦琪忆桃慕青问兰尔岚元香初夏沛菡傲珊曼文乐菱痴珊玉惜文香寒新柔语蓉海安夜蓉涵柏水桃醉蓝春儿语琴从彤傲晴语兰菱碧彤元霜怜梦紫寒妙彤曼易南莲紫翠雨寒易烟如萱若南寻真晓亦向珊慕灵以蕊寻雁映易雪柳孤岚笑霜海云凝天沛珊寒云冰旋宛儿绿'; -- 定义名
  DECLARE I_xing INT DEFAULT LENGTH(xing) / 3;    -- 定义姓的下标
  DECLARE I_ming INT DEFAULT LENGTH(ming) / 3;    -- 定义名的下标
  DECLARE return_str VARCHAR (2056) DEFAULT '';   -- 定义默认的返回值
  SET return_str = CONCAT(
    return_str,
    SUBSTRING(xing, FLOOR(1 + RAND() * I_xing), 1)    -- 截取xing集合中的随机一个下标,取一位(字符下标从1开始)
  );
  SET return_str = CONCAT(
    return_str,
    SUBSTRING(ming, FLOOR(1 + RAND() * I_ming), 1)
  );
  IF RAND() > 0.400    -- 如果随机函数值大于0.4.则添加第3个名字
  THEN SET return_str = CONCAT(
    return_str,
    SUBSTRING(ming, FLOOR(1 + RAND() * I_ming), 1)
  );
  END IF;     -- 结束if语句
  RETURN return_str;      -- 返回执行结果
END

【使用SQL】

SELECT generateName();

随机生成电话号码

【创建SQL】

CREATE FUNCTION `generatePhone`() RETURNS char(11) CHARSET utf8
    DETERMINISTIC
BEGIN
    DECLARE head VARCHAR(100) DEFAULT '159,156,136,176,183';
    DECLARE content CHAR(10) DEFAULT '0123456789';
    DECLARE phone CHAR(11) DEFAULT substring(head, 1+(FLOOR(1 + (RAND() * 3))*4), 3);
    DECLARE i int DEFAULT 1;
    DECLARE len int DEFAULT LENGTH(content);
    WHILE i<9 DO
        SET i=i+1;
        SET phone = CONCAT(phone, substring(content, floor(1 + RAND() * len), 1));
    END WHILE;
    RETURN phone;
END

【使用SQL】

select generatePhone();

随机生成日期、时间

【创建SQL】

## 生成某一年随机日期的函数
create function generateDate(year varchar(4)) returns varchar(10)
begin
    return concat(year,'-',floor(1+rand()*10),'-',floor(1+rand()*28));
END 

## 生成某一年随机时间的函数
create function generateTime(year varchar(4)) returns varchar(19)
begin
    return concat(year,'-',floor(1+rand()*10),'-',floor(1+rand()*28),' ',floor(8+rand()*10),':',floor(10+rand()*49),':',floor(10+rand()*49));
END 

【使用SQL】

## 生成2020年的任意一个日期
SELECT generateDate("2020");

## 生成2020年的任意一个时间
SELECT generateTime("2020");

随机生成邮箱

【创建SQL】

CREATE FUNCTION `generateEmail`(emailType VARCHAR(36)) RETURNS char(100) CHARSET utf8
    DETERMINISTIC
BEGIN
  DECLARE head VARCHAR (100) DEFAULT '159,182,150,136,152,158,183';
  DECLARE content CHAR(10) DEFAULT '0123456789';
  DECLARE phone CHAR(11) DEFAULT SUBSTRING(head, 1+ (FLOOR(1 + (RAND() * 3)) * 4), 3);
  DECLARE email CHAR(100); 
  DECLARE i INT DEFAULT 1;
  DECLARE len INT DEFAULT LENGTH(content);
  WHILE
    i < 9 DO SET i = i + 1;
    SET phone = CONCAT(phone, SUBSTRING(content, FLOOR(1 + RAND() * len), 1));
  END WHILE;
	set email = CONCAT(phone,emailType); -- 入参 emailType = @xxx.com
  RETURN email;
END

【使用SQL】

## 根据指定邮箱后缀生成邮箱
SELECT generateEmail("@sina.com");

批量生成数据

以下表结构为示例sql,可根据实际情况作出更改
插入sql中用到的函数来自本文前半部分

【创建表】

DROP TABLE IF EXISTS `users`;
CREATE TABLE `users`  (
  `uid` int(11) NOT NULL AUTO_INCREMENT,
  `uname` varchar(16) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `age` int(11) NULL DEFAULT NULL,
  `phone` varchar(11) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `email` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `create_date` datetime NULL DEFAULT NULL,
  `remarks` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  PRIMARY KEY (`uid`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

【定义存储过程】

delimiter //
CREATE PROCEDURE BatchInsertUsers(IN num int)
  BEGIN
      DECLARE flag INT;
      SET flag = 0;
      WHILE flag < num DO
          insert into users (uname,age,phone,email,create_date,remarks) 
values (generateName(),generateNum(18,80),generatePhone(),generateEmail("@sina.com"),generateTime("2021"),generateStr(10));
          SET flag = flag + 1;
      END WHILE;
  END;
  //
delimiter ;

【批量插入数据】

call BatchInsertUsers(100000);

以上是关于MySql大批量生成测试数据的主要内容,如果未能解决你的问题,请参考以下文章

mysql大批量生成测试数据

Mysql动态生成字母+固定位数的随机数

python pandas 自动生成批量测试数据插入数据库 mysql

Mysql生成任意指定两时间范围内的日期列表

在原点的给定半径范围内和外部生成随机坐标

Python助力性能测试——报文批量生成