1.首先创建姓氏与名字的表。
fname是存储姓氏的表,lname表是存储名字的表。
create table fname(
id int auto_increment PRIMARY KEY,
name varchar(50)
);
create table lname(
id int auto_increment PRIMARY KEY,
name varchar(50)
);
2.向表中插入常见的姓氏与名字。
insert into fname (name)
values
('赵'),('钱'),('孙'),
('李'),('周'),('吴'),('郑'),('王'),('冯'),('陈'),('褚'),('卫'),('蒋'),('沈'),('韩'),
('杨'),('朱'),('秦'),('尤'),('许'),('何'),('吕'),('施'),('张'),('孔'),('曹'),('严'),
('华'),('金'),('魏'),('陶'),('姜'),('戚'),('谢'),('邹'),('喻'),('柏'),('水'),('窦'),
('章'),('云'),('苏'),('潘'),('葛'),('奚'),('范'),('彭'),('郎'),('鲁'),('韦'),('昌'),
('马'),('苗'),('凤'),('花'),('方'),('俞'),('任'),('袁'),('柳'),('酆'),('鲍'),('史'),
('唐'),('费'),('廉'),('岑'),('薛'),('雷'),('贺'),('倪'),('汤'),('滕'),('殷'),('罗'),
('毕'),('郝'),('邬'),('安'),('常'),('乐'),('于'),('时'),('傅'),('皮'),('卞'),('齐'),
('康'),('伍'),('余'),('元'),('卜'),('顾'),('孟'),('平'),('黄'),('和'),('穆'),('萧'),
('尹'),('姚'),('邵'),('湛'),('汪'),('祁'),('毛'),('禹'),('狄'),('米'),('贝'),('明'),
('臧'),('计'),('伏'),('成'),('戴'),('谈'),('宋'),('茅'),('庞'),('熊'),('纪'),('舒'),
('屈'),('项'),('祝'),('董'),('梁'),('杜'),('阮'),('蓝'),('闵'),('席'),('季'),('麻'),
('强'),('贾'),('路'),('娄'),('危'),('江'),('童'),('颜'),('郭'),('梅'),('盛'),('林'),
('刁'),('钟'),('徐'),('邱'),('骆'),('高'),('夏'),('蔡'),('田'),('樊'),('胡'),('凌'),
('霍'),('丁'),('邓'),('洪'),('包'),('程'),('崔'),('陆'),('嵇'),('荀'),('裴'),('封'),
('白'),('叶'),('万俟'),('司马'),('上官'),('欧阳'),('夏侯'),('诸葛'),('闻人'),('东方'),
('赫连'),('皇甫'),('尉迟'),('公羊'),('澹台'),('公冶'),('宗政'),('濮阳'),('淳于'),('单于'),
('太叔'),('申屠'),('公孙'),('仲孙'),('轩辕'),('令狐'),('钟离'),('宇文'),('长孙'),('慕容'),
('鲜于'),('闾丘'),('司徒'),('司空'),('司寇'),('颛孙'),('端木'),('乐正'),('百里'),('东郭'),
('南门'),('呼延'),('梁丘'),('左丘'),('西门');
插入完姓氏后,再插入名字,名字这里需要设置符合现实的逻辑,不能胡乱插入常见的名字,然后随机生成名字时随机选取名字表中的任意名字,这就成了胡乱起名了。我们需要知道,起名是要区分男女的,所以,我们可以将女性常用名与男性常用名分开。随机生成时只选取男性或者女性区域的名字。解释一下,176是插入男性常用名的数量,创建存储过程时可以用该数字区分男性和女性的区域。
INSERT INTO lname (name) VALUES
('伟'), ('强'), ('勇'), ('军'), ('平'), ('志'), ('杰'), ('涛'), ('明'), ('刚'),
('健'), ('华'), ('峰'), ('超'), ('辉'), ('鹏'), ('雷'), ('洋'), ('磊'), ('浩'),
('帆'), ('宇'), ('豪'), ('阳'), ('建'), ('国'), ('远'), ('文'), ('东'), ('亮'),
('成'), ('荣'), ('鑫'), ('旭'), ('宁'), ('庆'), ('飞'), ('振'), ('锋'), ('毅'),
('博'), ('安'), ('岩'), ('彬'), ('坤'), ('震'), ('凯'), ('江'), ('世'), ('永'),
('清'), ('深'), ('超'), ('林'), ('兴'), ('昌'), ('波'), ('旺'), ('良'), ('建'),
('金'), ('民'), ('有'), ('广'), ('盛'), ('保'), ('星'), ('天'), ('川'), ('奇'),
('才'), ('进'), ('茂'), ('进'), ('全'), ('义'), ('旭'), ('德'), ('胜'), ('武'),
('连'), ('营'), ('银'), ('鸿'), ('森'), ('晓'), ('顺'), ('毛'), ('宏'), ('双'),
('靖'), ('铭'), ('琛'), ('川'), ('承'), ('司'), ('斯'), ('宗'), ('骁'), ('容'),
('聪'), ('在'), ('钩'), ('锦'), ('铎'), ('楚'), ('铮'), ('钦'), ('则'), ('恩'),
('楠'), ('景'), ('茗'), ('聿'), ('启'), ('尧'), ('言'), ('嘉'), ('桉'), ('衡'),
('桐'), ('筒'), ('竹'), ('林'), ('乔'), ('栋'), ('家'), ('翊'), ('松'), ('宇'),
('清'), ('澈'), ('泫'), ('浚'), ('润'), ('泽'), ('向'), ('凡'), ('文'), ('硕'),
('浦'), ('洲'), ('珩'), ('玄'), ('洋'), ('淮'), ('雨'), ('子'), ('云'), ('允'),
('卓'), ('昱'), ('南'), ('晨'), ('知'), ('宁'), ('年'), ('易'), ('晗'), ('延'),
('炎'), ('焕'), ('哲'), ('煦'), ('旭'), ('明'), ('阳'), ('朗'), ('典'), ('以'),
('辰'), ('宸'), ('野'), ('安'), ('为'), ('岚');
-- 176
INSERT INTO lname (name) VALUES
('玲'), ('丽'), ('敏'), ('燕'), ('莉'), ('娟'), ('婷'), ('芳'), ('静'), ('欣'),
('倩'), ('娜'), ('佳'), ('颖'), ('洁'), ('雯'), ('琳'), ('霞'), ('慧'), ('蓉'),
('妍'), ('菲'), ('彤'), ('晶'), ('爽'), ('怡'), ('秀'), ('宁'), ('涵'), ('舒'),
('萱'), ('珊'), ('宇'), ('凝'), ('馨'), ('惠'), ('羽'), ('琼'), ('蕾'), ('韵'),
('媛'), ('珍'), ('薇'), ('岚'), ('若'), ('露'), ('彩'), ('唯'), ('柔'), ('妮'),
('莺'), ('雪'), ('霓'), ('霁'), ('朵'), ('芬'), ('艳'), ('菲'), ('芸'), ('女'),
('丽'), ('敏'), ('燕'), ('莉'), ('娟'), ('婷'), ('芳'), ('静'), ('欣'), ('倩'),
('娜'), ('佳'), ('颖'), ('洁'), ('雯'), ('琳'), ('霞'), ('慧'), ('蓉'), ('妍'),
('菲'), ('彤'), ('晶'), ('爽'), ('怡'), ('秀'), ('宁'), ('涵'), ('舒'), ('萱'),
('珊'), ('宇'), ('凝'), ('馨'), ('惠'), ('羽'), ('琼'), ('蕾'), ('韵'), ('媛'),
('珍'), ('薇'), ('岚'), ('若'), ('露'), ('彩'), ('唯'), ('柔'), ('妮'), ('莺'),
('雪'), ('霓'), ('霁'), ('朵'), ('屿'), ('蓓'), ('菁'), ('寒'), ('玫'), ('冰'),
('琦'), ('茜'), ('蔷'), ('怡'), ('英'), ('瑶'), ('华'), ('曼'), ('淑'), ('诗'),
('香'), ('月'), ('美'), ('枝'), ('钰'), ('竹'), ('真'), ('亦'), ('桐'), ('紫'),
('珊'), ('秋'), ('艳'), ('叶'), ('薇'), ('柏'), ('珊'), ('桃'), ('梦'), ('岚'),
('凌'), ('琴'), ('蓉'), ('菊'), ('秋'), ('霜'), ('子'), ('灵'), ('萍'), ('茹'),
('婕'), ('璐'), ('怡'), ('颖'), ('凝'), ('嫣'), ('芸'), ('聪'), ('红'), ('娅'),
('静'), ('婕'), ('珊'), ('芝'), ('倩'), ('楠'), ('娟'), ('英'), ('慧'), ('雯'),
('怡'), ('珊'), ('琼'), ('娜'), ('舒'), ('洁'), ('智'), ('彦'), ('兰'), ('美'),
('仪'), ('君'), ('春'), ('姿'), ('宜'), ('熙'), ('萍'), ('玉'), ('辰'), ('佳'),
('楠'), ('梦'), ('薇'), ('祯'), ('涵'), ('蓓'), ('茜'), ('靖'), ('馨'), ('苑');
3.创建随机生成姓名的存储过程
创建好表后,然后创建生成姓名的存储过程,随机生成姓名的存储过程分很多种,比如无复姓生成的姓名有2个或3个字,有复姓,生成的姓名有2个、3个或4个字,看自己需要哪种,这里是有复姓,随机生成的姓名有2个或者3个。如果自己的需求和我的不一样,其实看着语句进行适当的修改就行,基本逻辑都是一样的。
DELIMITER //
CREATE PROCEDURE proc_randName(OUT out_name VARCHAR(50))
BEGIN
DECLARE first_name VARCHAR(20);
DECLARE last_name_1 VARCHAR(20);
DECLARE last_name_2 VARCHAR(20);
DECLARE gender ENUM('M', 'F');
DECLARE full_name VARCHAR(50);-- 随机选择一个姓氏
SELECT name INTO first_name FROM fname ORDER BY RAND() LIMIT 1;-- 判断是否为复姓
SET @is_double_surname := CASE WHEN (SELECT id FROM fname WHERE id > 185 AND name = first_name) IS NOT NULL THEN 1 ELSE 0 END;-- 随机生成性别
SET gender = IF(RAND() < 0.5, 'M', 'F');-- 随机选择一个名字作为 last_name_1
IF gender = 'M' THEN
SELECT name INTO last_name_1 FROM lname WHERE id <= 176 ORDER BY RAND() LIMIT 1;
ELSE
SELECT name INTO last_name_1 FROM lname WHERE id > 176 ORDER BY RAND() LIMIT 1;
END IF;-- 如果为复姓且只能有一个字的名字,则将 last_name_2 置为空
IF @is_double_surname = 1 THEN
SET last_name_2 = '';
ELSE
-- 随机生成是否使用第二个名字
SET @use_second_name := FLOOR(RAND() * 2);-- 如果需要使用第二个名字
IF @use_second_name = 1 THEN
-- 随机选择一个名字作为 last_name_2
IF gender = 'M' THEN
SELECT name INTO last_name_2 FROM lname WHERE id <= 176 ORDER BY RAND() LIMIT 1;
ELSE
SELECT name INTO last_name_2 FROM lname WHERE id > 176 ORDER BY RAND() LIMIT 1;
END IF;
ELSE
SET last_name_2 = '';
END IF;
END IF;-- 组合姓氏和名字,生成最终的姓名
SET full_name := CONCAT_WS(' ', first_name, last_name_1, last_name_2);-- 返回生成的姓名
SET out_name := full_name;
END //
4.结果