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);
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小妖云汐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值