本文主要是介绍MySQL批量随机生成name、TEL、idNumber,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
通过创建存储函数得到三种随机数据,调用存储过程中使用函数得到批量数据插入表中,再通过子查询嵌套group by简单去重。
一、函数
随机姓名生成函数rand_name()
声明两变量xing、ming保存部分人使用的名字库,通过随机函数rand()取得xing、ming中的各一字,如果特判rand()再决定是否是单字或者双字。
可自行对xing(姓)、ming(名)进行增删提高数据真实性。
-- 开启允许创建函数
set global log_bin_trust_function_creators = 1;
-- 创建随机生成姓名函数 rand_name
drop function if exists rand_name;
DELIMITER $$
CREATE FUNCTION rand_name() RETURNS varchar(16)
BEGINDECLARE 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));SET return_str = CONCAT(return_str,SUBSTRING(ming, FLOOR(1 + RAND() * I_ming), 1));IF RAND() > 0.400THEN SET return_str = CONCAT(return_str,SUBSTRING(ming, FLOOR(1 + RAND() * I_ming), 1));END IF;RETURN return_str;
END$$
DELIMITER ;
-- 调用函数
select rand_name();
随机TEL生成函数generatePhone()
与上个函数同理,预先定义好了前3个数字,后面8个数字随机取得。
可自行对head进行增删提高数据真实性。
-- 创建随机生成手机号函数 generatePhone
drop function if exists generatePhone;
delimiter $$
CREATE FUNCTION `generatePhone`() RETURNS char(11) CHARSET utf8DETERMINISTIC
BEGINDECLARE head VARCHAR(200) DEFAULT '134,135,136,137,138,139,147,150,151,152,157,158,159,182,183,184,187,188,130,131,132,145,155,156,185,186,199,133,153,180,181,189';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 DOSET i=i+1;SET phone = CONCAT(phone, substring(content, floor(1 + RAND() * len), 1));END WHILE;RETURN phone;
end$$
delimiter ;
-- 查询随机手机号
select generatePhone();
随机idNumber生成函数genIdNumber()
同理,实现定义好三部分,,后四位随机生成。
可自行对head、years、months进行增删提高数据真实性。
-- idNumber随机生成
drop function if exists genIdNumber;
DELIMITER $$
DROP FUNCTION IF EXISTS genIdNumber$$
CREATE FUNCTION `genIdNumber`() RETURNS char(18) CHARSET utf8DETERMINISTIC
BEGINDECLARE head VARCHAR(100) DEFAULT '000000,321102,321001,320112,320021,360735,361145,360302,360907,340323,340829,260504';DECLARE years VARCHAR(100) DEFAULT '0000,1995,1993,1990,1999,2002,2001,1998,1985,1977,1989,1979';DECLARE months VARCHAR(100) DEFAULT '0000,1201,1203,0903,1111,0201,0305,1215,0604,0504,0319,0707';DECLARE content CHAR(10) DEFAULT '0123456789';DECLARE headd CHAR(11) DEFAULT substring(head, 1+(FLOOR(1 + (RAND() * 4))*7), 6);DECLARE yeard CHAR(11) DEFAULT substring(years, 1+(FLOOR(1 + (RAND() * 4))*5), 4);DECLARE monthd CHAR(11) DEFAULT substring(months, 1+(FLOOR(1 + (RAND() * 4))*5), 4);DECLARE idcard CHAR(18) DEFAULT CONCAT(headd,yeard,monthd);DECLARE i int DEFAULT 1;DECLARE len int DEFAULT LENGTH(content);WHILE i<5 DOSET i=i+1;SET idcard = CONCAT(idcard, substring(content, floor(1 + RAND() * len), 1));END WHILE;RETURN idcard;
END $$
DELIMITER ;
-- 调用函数
select genIdNumber();
二、测试与去重
创建一个测试表,4个字段,`id`自增,`name`姓名,`phone`电话号码,`idnumber`.
-- 创建表进行测试
drop table if exists study_user;
create table study_user (`id` int not null auto_increment ,`name` varchar(16) default null,`phone` char(11),`idnumber` char(18),primary key (id)
);
创建批量生成数据的存储过程insert_user(in num int)
通过循环传入的参数num,来在insert语句中调用3个存储函数来得到批量随机组合。(小概率随机重复)
-- 创建批量生成表数据存储过程
drop procedure insert_user;
delimiter $$
create PROCEDURE insert_user(in num int)
begin-- 记录循环次数declare i int default 0;-- 关闭自动提交set autocommit = 0;-- 循环insertwhile i < num doinsert into study_user(name, phone, idnumber) values(rand_name(), generatePhone(), genIdNumber());set i = i + 1;end while;commit;end$$
delimiter ;
执行存储过程,并通过嵌套三层子查询group by简单去重。
-- 执行存储过程
call insert_user(100); #数据量
-- 数据去重,取唯一组数据
select * from(select * from (select * from study_user group by phone) as temp_data group by idnumber) as temp_data02 group by name;
-- 查看数据
select * from study_user;
获得数据结果,部分如下。
这篇关于MySQL批量随机生成name、TEL、idNumber的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!