MySQL创建随机生成姓名的存储过程

 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.结果

 

  • 26
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

SmoothSailingT

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

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

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

打赏作者

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

抵扣说明:

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

余额充值