如何批量生成MySQL不重复手机号大表实例代码

 更新时间:2018年11月26日 08:42:23   作者:Leshami  
这篇文章主要给大家介绍了关于如何批量生成MySQL不重复手机号大表的相关资料,,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

前言

在MySQL很多测试场景,需要人工生成一些测试数据来测试。本文提供一个构造MySQL大表存储过程,可以生成包含用户名,手机号码,出生日期等字段。也可以通过滤重来使得手机号码不重复,模拟现实场景。

一、生成脚本

生成说明:

以下使用存储过程批量生成包含用户名,手机号,出生日期等字段大表。

该存储过程使用基于uid作为主键,因此会生成少量重复手机号码,后面有滤重SQL脚本。

如果想一次性生成不重复手机号码,可以考虑修改以下脚本,去掉uid,基于mobile列作为主键

DROP TABLE IF EXISTS big_table;

DROP PROCEDURE IF EXISTS prc_gen_user;

CREATE TABLE `big_table` (
 `uid` int(11) NOT NULL AUTO_INCREMENT,
 `mobile` char(11) DEFAULT NULL,
 `passwd` varchar(50) DEFAULT NULL,
 `name` varchar(50) DEFAULT NULL,
 `sex` tinyint DEFAULT NULL,
 `birthday` datetime DEFAULT NULL,
 `updated_time` datetime DEFAULT NULL,
 PRIMARY KEY (`uid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE PROCEDURE prc_gen_user(l_cnt int)
BEGIN
 DECLARE x INT DEFAULT 0;
 DECLARE p char(11);

 WHILE x < l_cnt
 DO
 SET x = x + 1;
 SET p =
  concat('1',
   substring(cast(3 + (rand() * 10) % 7 AS char(50)), 1, 1),
   right(left(trim(cast(rand() AS char(50))), 11), 9));

 INSERT INTO big_table(mobile,
    passwd,
    name,
    sex,
    birthday,
    updated_time)
  VALUES (
   p,
   md5(ceiling(rand() * 1000000)),
   concat(
   substring(
    '赵钱孙李周吴郑王冯陈诸卫蒋沈韩杨朱秦尤许何吕施张孔曹严华金
    魏陶姜戚谢邹喻柏水窦章云苏潘葛奚范彭郎鲁韦昌马苗凤花方俞任
    袁柳酆鲍史唐费廉岑薛雷贺倪汤滕殷罗毕郝邬安常乐于时傅皮齐康
    伍余元卜顾孟平黄和穆萧尹姚邵堪汪祁毛禹狄米贝明臧计伏成戴谈
    宋茅庞熊纪舒屈项祝董粱杜阮蓝闵席季麻强贾路娄危江童颜郭梅盛
    林刁钟徐邱骆高夏蔡田樊胡凌霍虞万支柯咎管卢莫经房裘干解应宗
    丁宣贲邓郁单杭洪包诸左石崔吉钮龚',
    floor(1 + 190 * rand()),
    1),
   substring(
    '明国华建文平志伟东海强晓生光林小民永杰军金健一忠洪江福祥中
    正振勇耀春大宁亮宇兴宝少剑云学仁涛瑞飞鹏安亚泽世汉达卫利胜
    敏群波成荣新峰刚家龙德庆斌辉良玉俊立浩天宏子松克清长嘉红山
    贤阳乐锋智青跃元武广思雄锦威启昌铭维义宗英凯鸿森超坚旭政传
    康继翔栋仲权奇礼楠炜友年震鑫雷兵万星骏伦绍麟雨行才希彦兆贵
    源有景升惠臣慧开章润高佳虎根远力进泉茂毅富博霖顺信凡豪树和
    恩向道川彬柏磊敬书鸣芳培全炳基冠晖京欣廷哲保秋君劲轩帆若连
    勋祖锡吉崇钧田石奕发洲彪钢运伯满庭申湘皓承梓雪孟其潮冰怀鲁
    裕翰征谦航士尧标洁城寿枫革纯风化逸腾岳银鹤琳显焕来心凤睿勤
    延凌昊西羽百捷定琦圣佩麒虹如靖日咏会久昕黎桂玮燕可越彤雁孝
    宪萌颖艺夏桐月瑜沛诚夫声冬奎扬双坤镇楚水铁喜之迪泰方同滨邦
    先聪朝善非恒晋汝丹为晨乃秀岩辰洋然厚灿卓杨钰兰怡灵淇美琪亦
    晶舒菁真涵爽雅爱依静棋宜男蔚芝菲露娜珊雯淑曼萍珠诗璇琴素梅
    玲蕾艳紫珍丽仪梦倩伊茜妍碧芬儿岚婷菊妮媛莲娟一',
    floor(1 + 400 * rand()),
    1),
   substring(
    '明国华建文平志伟东海强晓生光林小民永杰军金健一忠洪江福祥中
    正振勇耀春大宁亮宇兴宝少剑云学仁涛瑞飞鹏安亚泽世汉达卫利胜
    敏群波成荣新峰刚家龙德庆斌辉良玉俊立浩天宏子松克清长嘉红山
    贤阳乐锋智青跃元武广思雄锦威启昌铭维义宗英凯鸿森超坚旭政传
    康继翔栋仲权奇礼楠炜友年震鑫雷兵万星骏伦绍麟雨行才希彦兆贵
    源有景升惠臣慧开章润高佳虎根远力进泉茂毅富博霖顺信凡豪树和
    恩向道川彬柏磊敬书鸣芳培全炳基冠晖京欣廷哲保秋君劲轩帆若连
    勋祖锡吉崇钧田石奕发洲彪钢运伯满庭申湘皓承梓雪孟其潮冰怀鲁
    裕翰征谦航士尧标洁城寿枫革纯风化逸腾岳银鹤琳显焕来心凤睿勤
    延凌昊西羽百捷定琦圣佩麒虹如靖日咏会久昕黎桂玮燕可越彤雁孝
    宪萌颖艺夏桐月瑜沛诚夫声冬奎扬双坤镇楚水铁喜之迪泰方同滨邦
    先聪朝善非恒晋汝丹为晨乃秀岩辰洋然厚灿卓杨钰兰怡灵淇美琪亦
    晶舒菁真涵爽雅爱依静棋宜男蔚芝菲露娜珊雯淑曼萍珠诗璇琴素梅
    玲蕾艳紫珍丽仪梦倩伊茜妍碧芬儿岚婷菊妮媛莲娟一',
    floor(1 + 400 * rand()),
    1)),
   ceiling(rand() * 10) % 2,
   date(
   now()
   - INTERVAL (20 + ceiling(rand() * 100) % 40) YEAR),
   concat('2018-',
    1 + ceiling(rand() * 100) % 12,
    '-',
    1 + ceiling(rand() * 100) % 28))
 ON DUPLICATE KEY UPDATE updated_time = now();
 END WHILE;
END

二、数据填充

call prc_gen_user(1000);
Query OK, 1 row affected (1.38 sec)

select count(*) from big_table;
+----------+
| count(*) |
+----------+
| 1000 |
+----------+
1 row in set (0.00 sec)
select 'Leshami' author,'http://blog.csdn.net/leshami' Blog;
+---------+------------------------------+
| author | Blog |
+---------+------------------------------+
| Leshami | http://blog.csdn.net/leshami |
+---------+------------------------------+

三、滤重SQL语句

DELETE FROM big_table
WHERE mobile IN (SELECT mobile
   FROM (SELECT u1.mobile
    FROM big_table u1
    GROUP BY u1.mobile
    HAVING count(*) > 1) a)
 AND uid NOT IN (SELECT uid
   FROM (SELECT min(u2.uid) AS uid
    FROM big_table u2
    GROUP BY u2.mobile
    HAVING count(*) > 1) b);

四、其它

本文参考了以下代码,下面代码实现是MySQL批量造用户数据,姓名/手机号/生日/密码

DROP PROCEDURE IF EXISTS batchGenerateUsers;


DELIMITER $$
CREATE PROCEDURE batchGenerateUsers()
BEGIN
DECLARE x INT Default 0;
    DECLARE p char(11);
WHILE x < 10000 DO
SET x=x+1;
        SET p=concat('1', cast(3+(rand()*10)%7 as char(1)), right(left(trim(cast(rand() as char (20))), 11),9));
insert into my_users(mobile, passwd, name, sex, birthday, updated_time)
values(p,
md5(ceiling(rand()*1000000)),
concat(substring('赵钱孙李周吴郑王冯陈诸卫蒋沈韩杨朱秦尤许何吕施张孔曹严华金魏陶姜戚谢邹喻柏水窦章云苏潘葛奚范彭郎鲁韦昌马苗凤花方俞任袁柳酆鲍史唐费廉岑薛雷贺倪汤滕殷罗毕郝邬安常乐于时傅皮齐康伍余元卜顾孟平黄和穆萧尹姚邵堪汪祁毛禹狄米贝明臧计伏成戴谈宋茅庞熊纪舒屈项祝董粱杜阮蓝闵席季麻强贾路娄危江童颜郭梅盛林刁钟徐邱骆高夏蔡田樊胡凌霍虞万支柯咎管卢莫经房裘干解应宗丁宣贲邓郁单杭洪包诸左石崔吉钮龚',floor(1+190*rand()),1),substring('明国华建文平志伟东海强晓生光林小民永杰军金健一忠洪江福祥中正振勇耀春大宁亮宇兴宝少剑云学仁涛瑞飞鹏安亚泽世汉达卫利胜敏群波成荣新峰刚家龙德庆斌辉良玉俊立浩天宏子松克清长嘉红山贤阳乐锋智青跃元武广思雄锦威启昌铭维义宗英凯鸿森超坚旭政传康继翔栋仲权奇礼楠炜友年震鑫雷兵万星骏伦绍麟雨行才希彦兆贵源有景升惠臣慧开章润高佳虎根远力进泉茂毅富博霖顺信凡豪树和恩向道川彬柏磊敬书鸣芳培全炳基冠晖京欣廷哲保秋君劲轩帆若连勋祖锡吉崇钧田石奕发洲彪钢运伯满庭申湘皓承梓雪孟其潮冰怀鲁裕翰征谦航士尧标洁城寿枫革纯风化逸腾岳银鹤琳显焕来心凤睿勤延凌昊西羽百捷定琦圣佩麒虹如靖日咏会久昕黎桂玮燕可越彤雁孝宪萌颖艺夏桐月瑜沛诚夫声冬奎扬双坤镇楚水铁喜之迪泰方同滨邦先聪朝善非恒晋汝丹为晨乃秀岩辰洋然厚灿卓杨钰兰怡灵淇美琪亦晶舒菁真涵爽雅爱依静棋宜男蔚芝菲露娜珊雯淑曼萍珠诗璇琴素梅玲蕾艳紫珍丽仪梦倩伊茜妍碧芬儿岚婷菊妮媛莲娟一',floor(1+400*rand()),1),substring('明国华建文平志伟东海强晓生光林小民永杰军金健一忠洪江福祥中正振勇耀春大宁亮宇兴宝少剑云学仁涛瑞飞鹏安亚泽世汉达卫利胜敏群波成荣新峰刚家龙德庆斌辉良玉俊立浩天宏子松克清长嘉红山贤阳乐锋智青跃元武广思雄锦威启昌铭维义宗英凯鸿森超坚旭政传康继翔栋仲权奇礼楠炜友年震鑫雷兵万星骏伦绍麟雨行才希彦兆贵源有景升惠臣慧开章润高佳虎根远力进泉茂毅富博霖顺信凡豪树和恩向道川彬柏磊敬书鸣芳培全炳基冠晖京欣廷哲保秋君劲轩帆若连勋祖锡吉崇钧田石奕发洲彪钢运伯满庭申湘皓承梓雪孟其潮冰怀鲁裕翰征谦航士尧标洁城寿枫革纯风化逸腾岳银鹤琳显焕来心凤睿勤延凌昊西羽百捷定琦圣佩麒虹如靖日咏会久昕黎桂玮燕可越彤雁孝宪萌颖艺夏桐月瑜沛诚夫声冬奎扬双坤镇楚水铁喜之迪泰方同滨邦先聪朝善非恒晋汝丹为晨乃秀岩辰洋然厚灿卓杨钰兰怡灵淇美琪亦晶舒菁真涵爽雅爱依静棋宜男蔚芝菲露娜珊雯淑曼萍珠诗璇琴素梅玲蕾艳紫珍丽仪梦倩伊茜妍碧芬儿岚婷菊妮媛莲娟一',floor(1+400*rand()),1)),
ceiling(rand()*10)%2,
date(now()-interval (20+ceiling(rand()*100)%40) year),
concat('2015-', 1+ceiling(rand()*100)%12,'-',1+ceiling(rand()*100)%28))
ON DUPLICATE KEY UPDATE
updated_time=now();
END WHILE;
END $$


#call batchGenerateUsers();

并对其进行适当修改。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

相关文章

  • Linux系统彻底删除Mysql的详细教程

    Linux系统彻底删除Mysql的详细教程

    我们在重新安装MySQL、或更新MySQL版本时,一定会遇到mysql数据残留(脏数据),或组件冲突等问题,下面这篇文章主要给大家介绍了关于Linux系统彻底删除Mysql的详细教程,需要的朋友可以参考下
    2023-02-02
  • MySQL基于SSL协议进行主从复制的详细操作教程

    MySQL基于SSL协议进行主从复制的详细操作教程

    这篇文章主要介绍了MySQL基于SSL协议进行主从复制的详细操作教程,示例环境基于Linux系统以及OpenSSL客户端,需要的朋友可以参考下
    2015-12-12
  • MySQL系列之七 MySQL存储引擎

    MySQL系列之七 MySQL存储引擎

    存储引擎是数据库的核心,对于mysql来说,存储引擎是以插件的形式运行的。虽然mysql支持种类繁多的存储引擎,但是常用的就那么几种。这篇文章主要给大家介绍MySQL存储引擎的相关知识,一起看看吧
    2021-07-07
  • sql语句中日期相减的操作实例代码

    sql语句中日期相减的操作实例代码

    在工作中遇到时间处理,学习了一下SQL的日期处理方面,下面这篇文章主要给大家介绍了关于sql语句中日期相减操作的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2022-09-09
  • MyBatis拦截器实现分页功能的实现方法

    MyBatis拦截器实现分页功能的实现方法

    这篇文章主要介绍了MyBatis拦截器实现分页功能的实现方法的相关资料,希望通过本文大家能够实现这样的方法,需要的朋友可以参考下
    2017-10-10
  • MySQL是如何处理排序的(最新推荐)

    MySQL是如何处理排序的(最新推荐)

    在MySQL的查询中常常会用到order by和group by这两个关键字,它们的相同点是都会对字段进行排序,那查询语句中的排序是如何实现的呢,下面跟随小编一起看看吧
    2024-05-05
  • mysql如何删除数据表和关联的数据表删除详情

    mysql如何删除数据表和关联的数据表删除详情

    这篇文章主要介绍了mysql如何删除数据表和关联的数据表删除详情,删除数据表的时候,表的定义和表中所有的数据均会被删除。因此,在进行删除操作前,最好对表中的数据做一个备份,以免造成无法挽回的后果
    2022-07-07
  • MySQL存储过程的创建和使用示例详解

    MySQL存储过程的创建和使用示例详解

    文章介绍了MySQL存储过程的概念、创建与删除、调用、变量使用、参数、流程控制、管理和案例,存储过程可以封装SQL指令,提高执行效率,但也有一定局限性,感兴趣的朋友跟随小编一起看看吧
    2025-02-02
  • 安装mysql noinstall zip版

    安装mysql noinstall zip版

    没用过mysql, 这几天折腾django ,发现连接mssql好像还是有些小bug,为了防止日后项目有些莫名的db故障,故选择django推荐之一的mysql
    2011-12-12
  • Mysql中MyISAM和InnoDB的区别及说明

    Mysql中MyISAM和InnoDB的区别及说明

    这篇文章主要介绍了Mysql中MyISAM和InnoDB的区别及说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12

最新评论