网站首页> 博客> MySQL一些随机函数记录

MySQL一些随机函数记录

好文 1579
LL
LL 2020-09-17
收藏

有时候我们需要模拟数据的进行测试,你是不是还在输入姓名,张三1,张三2?,手机号码13411111111?来来来,咱们可以用自定义函数来解决随机数据的生成,通过存储过程来批量插入数据。

1、创建一张学生表做测试

  1. CREATE DATABASE IF NOT EXISTS myschool;
  2. -- 选择myschool数据库
  3. USE myschool;
  4. -- 创建学生表结构
  5. DROP TABLE IF EXISTS `student`;
  6. CREATE TABLE `student`(
  7. `studentNo` INT(4) NOT NULL COMMENT '学号',
  8. `studentName` VARCHAR(50) NOT NULL COMMENT '学生姓名',
  9. `sex` CHAR(2) DEFAULT '男' NOT NULL COMMENT '性别',
  10. `gradeId` INT(4) UNSIGNED COMMENT '年级编号',
  11. `phone` VARCHAR(50) COMMENT '联系电话',
  12. `bornDate` DATETIME COMMENT '出生时间',
  13. PRIMARY KEY(`studentNo`)
  14. ) COMMENT '学生表';

 

2、随机函数

这些代码有些参考或来源于网络,有些是自己写的,一起执行吧,函数之间有些是依赖关系。

  1. -- 随机姓名
  2. DROP FUNCTION IF EXISTS randName;
  3. DELIMITER //
  4. CREATE FUNCTION randName()
  5. RETURNS VARCHAR(3)
  6. BEGIN
  7. DECLARE xing VARCHAR(2056) DEFAULT '赵钱孙李周郑王冯陈楮卫蒋沈韩杨朱秦尤许何吕施张孔曹严华金魏陶姜戚谢喻柏水窦章云苏潘葛奚范彭郎鲁韦昌马苗凤花方俞任袁柳酆鲍史唐费廉岑薛雷贺倪汤滕殷罗毕郝邬安常乐于时傅皮齐康伍余元卜顾孟平黄和穆萧尹姚邵湛汪祁毛禹狄米贝明臧计伏成戴谈宋茅庞熊纪舒屈项祝董梁杜阮蓝闽席季麻强贾路娄危江童颜郭梅盛林刁锺徐丘骆高夏蔡田樊胡凌霍虞万支柯昝管卢莫经裘缪干解应宗丁宣贲邓郁单杭洪包诸左石崔吉钮龚程嵇邢滑裴陆荣翁';
  8. DECLARE ming VARCHAR(2056) DEFAULT '嘉懿煜城懿轩烨伟苑博伟泽熠彤鸿煊博涛烨霖烨华煜祺智宸正豪昊然明杰诚立轩立辉峻熙弘文熠彤鸿煊烨霖哲瀚鑫鹏致远俊驰雨泽烨磊晟睿天佑文昊修洁黎昕远航旭尧鸿涛伟祺轩越泽浩宇瑾瑜皓轩擎苍擎宇志泽睿渊楷瑞轩弘文哲瀚雨泽鑫磊梦琪忆之桃慕青问兰尔岚元香初夏沛菡傲珊曼文乐菱痴珊恨玉惜文香寒新柔语蓉海安夜蓉涵柏水桃醉蓝春儿语琴从彤傲晴语兰又菱碧彤元霜怜梦紫寒妙彤曼易南莲紫翠雨寒易烟如萱若南寻真晓亦向珊慕灵以蕊寻雁映易雪柳孤岚笑霜海云凝天沛珊寒云冰旋宛儿绿真盼儿晓霜碧凡夏菡曼香若烟半梦雅绿冰蓝灵槐平安书翠翠风香巧代云梦曼幼翠友巧听寒梦柏醉易访旋亦玉凌萱访卉怀亦笑蓝春翠靖柏夜蕾冰夏梦松书雪乐枫念薇靖雁寻春恨山从寒忆香觅波静曼凡旋以亦念露芷蕾千兰新波代真新蕾雁玉冷卉紫山千琴恨天傲芙盼山怀蝶冰兰山柏翠萱乐丹翠柔谷山之瑶冰露尔珍谷雪乐萱涵菡海莲傲蕾青槐冬儿易梦惜雪宛海之柔夏青亦瑶妙菡春竹修杰伟诚建辉晋鹏天磊绍辉泽洋明轩健柏煊昊强伟宸博超君浩子骞明辉鹏涛炎彬鹤轩越彬风华靖琪明诚高格光华国源宇晗昱涵润翰飞翰海昊乾浩博和安弘博鸿朗华奥华灿嘉慕坚秉建明金鑫锦程瑾瑜鹏经赋景同靖琪君昊俊明季同开济凯安康成乐语力勤良哲理群茂彦敏博明达朋义彭泽鹏举濮存溥心璞瑜浦泽奇邃祥荣轩';
  9. DECLARE x_len INT DEFAULT CHAR_LENGTH(xing);
  10. DECLARE m_len INT DEFAULT CHAR_LENGTH(ming);
  11. DECLARE stuName VARCHAR(3) DEFAULT '';
  12. -- 随机姓
  13. SET stuName = CONCAT(stuName, SUBSTRING(xing,FLOOR(1 + RAND() * x_len),1));
  14. -- 随机第一个字名
  15. SET stuName = CONCAT(stuName, SUBSTRING(ming,FLOOR(1 + RAND() * m_len),1));
  16. -- 如果随机数小于0.5,再生成一个字
  17. IF RAND()>0.500 THEN
  18. -- 再选一个字做名
  19. SET stuName = CONCAT(stuName, SUBSTRING(ming, FLOOR(1 + RAND() * m_len), 1));
  20. END IF;
  21. RETURN stuName;
  22. END //
  23. DELIMITER ;
  24. -- 随机手机号码
  25. DROP FUNCTION IF EXISTS randPhone;
  26. DELIMITER //
  27. CREATE FUNCTION randPhone()
  28. RETURNS VARCHAR(11)
  29. BEGIN
  30. DECLARE duang VARCHAR(255) DEFAULT '134,135,136,137,138,139,147,150,151,152,157,158,159,178,182,183,184,187,188,130,131,132,155,156,185,186,145,176,133,153,177,180,181,189';
  31. DECLARE phone VARCHAR(11);
  32. DECLARE pos INT;
  33. SET pos = CHAR_LENGTH(duang) / 4;
  34. SET pos = FLOOR(1 + RAND() * pos);
  35. SET phone = REPLACE(SUBSTRING(SUBSTRING_INDEX(duang, ',', pos), LENGTH(SUBSTRING_INDEX(duang, ',', pos -1)) + 1), ',', '');
  36. SET phone = CONCAT(phone, SUBSTRING(CONCAT(RAND()), 3, 8));
  37. RETURN phone;
  38. END //
  39. DELIMITER ;
  40. -- 随机日期
  41. DROP FUNCTION IF EXISTS randDateTime;
  42. DELIMITER //
  43. CREATE FUNCTION randDateTime(startTime DATETIME, endTime DATETIME)
  44. RETURNS DATETIME
  45. BEGIN
  46. DECLARE result DATETIME;
  47. DECLARE sunix BIGINT DEFAULT UNIX_TIMESTAMP(startTime);
  48. DECLARE unix BIGINT;
  49. SET unix = FLOOR(sunix + RAND() * (UNIX_TIMESTAMP(endTime) - sunix));
  50. SET result = FROM_UNIXTIME(unix);
  51. RETURN result;
  52. END //
  53. DELIMITER ;
  54. -- 随机取单个字符
  55. DROP FUNCTION IF EXISTS randChar;
  56. DELIMITER //
  57. CREATE FUNCTION randChar(str VARCHAR(255))
  58. RETURNS VARCHAR(3)
  59. BEGIN
  60. DECLARE result VARCHAR(3);
  61. DECLARE len INT DEFAULT CHAR_LENGTH(str);
  62. SET result = SUBSTRING(str,FLOOR(1 + RAND() * len),1);
  63. RETURN result;
  64. END //
  65. DELIMITER ;
  66. -- 随机取N个字符
  67. DROP FUNCTION IF EXISTS randChars;
  68. DELIMITER //
  69. CREATE FUNCTION randChars(str VARCHAR(255), count INT)
  70. RETURNS VARCHAR(4000)
  71. BEGIN
  72. DECLARE result VARCHAR(4000);
  73. DECLARE len INT DEFAULT CHAR_LENGTH(str);
  74. SET result = '';
  75. WHILE count > 0 DO
  76. SET result = CONCAT(result, SUBSTRING(str,FLOOR(1 + RAND() * len),1));
  77. SET count = count - 1;
  78. END WHILE;
  79. RETURN result;
  80. END //
  81. DELIMITER ;
  82. -- 随机取N个简单字符
  83. DROP FUNCTION IF EXISTS randSimpleChars;
  84. DELIMITER //
  85. CREATE FUNCTION randSimpleChars(count INT)
  86. RETURNS VARCHAR(4000)
  87. BEGIN
  88. DECLARE result VARCHAR(4000);
  89. SET result = randChars('1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz', count);
  90. RETURN result;
  91. END //
  92. DELIMITER ;
  93. -- 随机取N个数字字符
  94. DROP FUNCTION IF EXISTS randNumChars;
  95. DELIMITER //
  96. CREATE FUNCTION randNumChars(count INT)
  97. RETURNS VARCHAR(4000)
  98. BEGIN
  99. DECLARE result VARCHAR(4000);
  100. SET result = randChars('1234567890', count);
  101. RETURN result;
  102. END //
  103. DELIMITER ;
  104. -- 随机取N个字母字符
  105. DROP FUNCTION IF EXISTS randLetterChars;
  106. DELIMITER //
  107. CREATE FUNCTION randLetterChars(count INT)
  108. RETURNS VARCHAR(4000)
  109. BEGIN
  110. DECLARE result VARCHAR(4000);
  111. SET result = randChars('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz', count);
  112. RETURN result;
  113. END //
  114. DELIMITER ;
  115. -- 随机数字范围(包含上下限)
  116. DROP FUNCTION IF EXISTS randValue;
  117. DELIMITER //
  118. CREATE FUNCTION randValue(min INT, max INT)
  119. RETURNS INT
  120. BEGIN
  121. DECLARE result INT;
  122. SET result = min + FLOOR(RAND() * (max - min + 1));
  123. RETURN result;
  124. END //
  125. DELIMITER;
  126. -- 随机数字限制上限(包含上限)
  127. DROP FUNCTION IF EXISTS randMax;
  128. DELIMITER //
  129. CREATE FUNCTION randMax(max INT)
  130. RETURNS INT
  131. BEGIN
  132. RETURN randValue(0, max);
  133. END //
  134. DELIMITER; ;

3、编写插入数据存储过程

  1. -- 删除添加学生的存储过程
  2. DROP PROCEDURE IF EXISTS `add_student`;
  3. DELIMITER //
  4. CREATE PROCEDURE `add_student`(ct INT)
  5. BEGIN
  6. DECLARE i INT;
  7. DECLARE id INT;
  8. -- 查询获取当前的的学生总数
  9. SET i = (SELECT COUNT(1) FROM student);
  10. -- 查询获取当前最大的ID,当然ID如果是自动增长也可以不设置
  11. SET id = (SELECT IFNULL(MAX(studentNo),1) FROM student);
  12. -- 设置取消自动提交,避免每次都提交事务速度太慢,当然如果太多数量,可以分批次提交。
  13. SET AUTOCOMMIT=0;
  14. WHILE i < ct DO
  15. -- 随机插入数据
  16. INSERT INTO student (
  17. `studentNo`,
  18. `studentName`,
  19. `sex`,
  20. `gradeId`,
  21. `phone`,
  22. `bornDate`
  23. ) VALUES(id, randName(), randChar('男女'), randValue(1, 30), randPhone(), randDateTime('1989-01-01', '2001-11-11'));
  24. SET i = i + 1;
  25. set id = id + 1;
  26. END WHILE;
  27. SET AUTOCOMMIT=1;
  28. -- 提交数据
  29. COMMIT;
  30. END
  31. //
  32. DELIMITER ;

4、激动人心,来一波测试吧

  1. -- 调用存储过程插入学员信息100w条,很耗时间,大家酌情添加
  2. CALL add_student(1000000);

5、查查看,数据是不是很像真实数据

  • 没有任何评论
个评论
LL

LL (青铜)

1金币 (0)粉丝 (1)源码

(该家伙很懒,什么也没说!)

 

加入微信群,不定期分享源码和经验
签到活跃榜 连续签到送额外金币
最新博客
校园跑腿系统外卖系统软件平台大学生创业平台搭建 464
壹脉销客智能名片CRM系统小程序可二开源码交付部署 452
为啥没搞了 652
Nginx 的 5 大应用场景,太实用了! 931
CentOS 8-stream 安装Postgresql 详细教程 1095
JAVA智慧校园管理系统小程序源码 电子班牌 Sass 模式 1055
Java智慧校园系统源码 智慧校园源码 智慧学校源码 智慧校园管理系统源码 小程序+电子班牌 800
Java智慧校园系统源码 智慧校园源码 智慧学校源码 智慧校园管理系统源码 小程序+电子班牌 781
致远OA权限 1272
发博客会有金币吗 816