MySQL百万数据插入

在开发的过程时,我们需要大量的数据进行测试,可以用数据库函数执行百万、千万级别的数据。

以学生信息为例,在学生信息中,字段有:编号、姓名、性别、生日、班级、手机号、身份证号、邮箱、家庭住址。

1、创建辅助表,用于学生信息表提供字段值。

1.1地址省表

1.2地址市表

1.3地址区表

1.4姓氏表 

#新建姓氏表
drop TABLE if exists FamilyName;
CREATE TABLE FamilyName
(
ID int auto_increment PRIMARY KEY,
Family varchar(2)
);
#插入姓氏数据
DROP FUNCTION IF EXISTS fc_family;
CREATE FUNCTION fc_family() RETURNS char(10)
BEGIN
DECLARE num int DEFAULT 1;
DECLARE str VARCHAR(5000) DEFAULT '1';
SET str='赵,钱,孙,李,周,吴,郑,王,陈,褚,卫,蒋,沈,韩,杨,朱,秦,尤,许,何,吕,施,张,孔,曹,严,华,金,魏,陶,姜,戚,谢,邹,喻,柏,水,窦,章,云,苏,潘,葛,奚,范,彭,郎,鲁,韦,昌,马,苗,凤,花,方,俞,任,袁,柳,酆,鲍,史,唐,费,廉,岑,薛,雷,贺,倪,汤,滕,殷,罗,毕,郝,邬,安,常,乐,于,时,傅,皮,卞,齐,康,伍,余,元,卜,顾,孟,平,黄,和,穆,萧,尹,姚,邵,湛,汪,祁,毛,禹,狄,米,贝,明,臧,计,伏,成,戴,谈,宋,茅,庞,熊,纪,舒,屈,项,祝,董,粱,杜,阮,蓝,闵,席,季,麻,强,贾,路,娄,危,江,童,颜,郭,梅,盛,林,刁,钟,徐,邱,骆,高,夏,蔡,田,樊,胡,凌,霍,虞,万,支,柯,昝,管,卢,莫,经,房,裘,缪,干,解,应,宗,丁,宣,贲,邓,郁,单,杭,洪,包,诸,左,石,崔,吉,钮,龚,程,嵇,邢,滑,裴,陆,荣,翁,荀,羊,於,惠,甄,麴,家,封,芮,羿,储,靳,汲,邴,糜,松,井,段,富,巫,乌,焦,巴,弓,牧,隗,山,谷,车,侯,宓,蓬,全,郗,班,仰,秋,仲,伊,宫,宁,仇,栾,暴,甘,钭,厉,戎,祖,武,符,刘,景,詹,束,龙,叶,幸,司,韶,郜,黎,蓟,薄,印,宿,白,怀,蒲,邰,从,鄂,索,咸,籍,赖,卓,蔺,屠,蒙,池,乔,阴,欎,胥,能,苍,双,闻,莘,党,翟,谭,贡,劳,逄,姬,申,扶,堵,冉,宰,郦,雍,舄,璩,桑,桂,濮,牛,寿,通,边,扈,燕,冀,郏,浦,尚,农,温,别,庄,晏,柴,瞿,阎,充,慕,连,茹,习,宦,艾,鱼,容,向,古,易,慎,戈,廖,庾,终,暨,居,衡,步,都,耿,满,弘,匡,国,文,寇,广,禄,阙,东,欧,殳,沃,利,蔚,越,夔,隆,师,巩,厍,聂,晁,勾,那,简,饶,空,曾,毋,沙,乜,养,鞠,须,丰,巢,关,蒯,相,查,後,荆,红,游,竺,权,逯,盖,益,桓';
WHILE num<=CHAR_LENGTH(str) DO
insert into FamilyName(Family) VALUES (SUBSTRING(str,num,1));
set num=num+2;
END WHILE;
return '成功';
END;

#执行函数,插入姓氏
select fc_family();

1.5名字表 

#新建名字表
drop TABLE if exists FName;
CREATE TABLE FName
(
ID int auto_increment PRIMARY KEY,
Fname varchar(2)
);
#插入名字数据
DROP FUNCTION IF EXISTS fc_name;
CREATE FUNCTION fc_name() RETURNS char(10)
BEGIN
DECLARE rand int DEFAULT 1;
DECLARE num int DEFAULT 1;
DECLARE str VARCHAR(5000) DEFAULT '1';
SET str='中华初繁睡狮渐醒玖久纪末千年始零宏业昌盛妙策递迎左右兼顾总揽统领内取稳进外交志同阶梯过度切忌狠猛六贼七害监视审听戒贪须效践约宜行贬恶褒绩赏劝罚惩操刃执斧塞涓救荧势如突起抽薪熄平途逢险兆消芽于萌调息止纷贵在用衡依法谋治官吏皆正推贤荐材睹貌辨容纯朴宽厚侠烈尽忠耿直肃仪襟怀袒诚谄媚狡猾敏慧颖懈怠懒惰拙笨碌庸愚昧糊涂偏才至聪羞涩拘束杰健悍雄恭谨畏惧缄默持重骄奢傲慢怯懦惶恐超逸独居恬淡匀宁疑诡秘威严毅勇币帛钱攘夺其宗企财盼利价值均等务呐娜史卧家佳加雄晓工开厂增富减穷资产累计税率加乘银行贷款储蓄倍宠抵押拆借循例不停供给需求市货充盈销售买卖亏差余剩债券股票博赌输赢闻赚虽喜跌赔癫疯休闲退优涣虑受逍拒宾疏客忧谢欢招把盏讲趣倚床读晓游景筏渡迹绝喧嚣茂冠蔽枝莽园出条碧岭滴翠落叶飘摇心澄彻透雅悦去燥挥毫绎就佳句抒了漆珠镶眸秀眉斜弯樱口含笑脂靥隐现敖鼻单翘坠耳双环舒额弹腮龙睛凤眼纤手藕臂软颈削肩乌发比臀酥胸腰间修腿负躯弓脚婷站沐浴洁身梳妆乔扮薄黛轻施靓耀矫莲服锦饰佩缤绫绣缎赞叹称颂宛若娥仙阿弥陀佛觉悟融圆僧尼寂寞萨向善情投系姻净见缘转识性苦乐恼烦圣诞基督原罪赎还目的辩证裁判邪端朝觐跪拜先知注传我主保佑好娃阿丹格林童话伊索寓言莎翁托氏福摩探案但丁哥德伽丘十谈培根牛顿爱因斯坦试管婴儿克隆遗传细胞速冷脱氧核酸脉冲数码几何规范网络通讯控遥感驱逐舰艇洲际导弹激光辐射捆绑火箭声纳测距贫铀污染点线面段球弧侧弦菱锥棱角顶尖竖撇捺折陡拱椭圈奥运竞技淘汰筛选跨跃短跑蹦跳撑竿铁饼标枪垒足排篮汽车拉力驾舢驶帆刀锤棍棒钩爪杖鞭锁链杠铃摔跤击拳省区';
WHILE num<=CHAR_LENGTH(str) DO
SET rand=ROUND(RAND()+1);
insert into FName(Fname) VALUES (SUBSTRING(str,num,rand));
set num=num+rand;
END WHILE;
return '成功';
END;

#执行函数,插入名字
select fc_name();

2、创建学生信息表

#新建学生信息数据表
drop TABLE if exists stuinfo;
CREATE TABLE stuinfo
(
ID bigint auto_increment PRIMARY KEY,
stuName char(20),
stuSex char(2),
stuBirthDay datetime,
stuGrade int,
stuTel CHAR(11),
stuIdentity char(18),
stuEmail char(15),
stuAdd varchar(50)
);

#创建函数插入数据
DROP FUNCTION IF EXISTS fc_insert;
CREATE FUNCTION fc_insert( num int) RETURNS char(10)
BEGIN
  #行
  declare Rows int DEFAULT 1;
   #姓名
  DECLARE namesum VARCHAR(10) DEFAULT '1';
  DECLARE name1 VARCHAR(10) DEFAULT '1';
  DECLARE name2 VARCHAR(10) DEFAULT '1'; 
  declare rand1 int DEFAULT 1;
  declare rand2 int DEFAULT 1;
   #性别
  DECLARE sex VARCHAR(2) DEFAULT '1'; 
  declare randsex int DEFAULT 1;
   #出生日期
  DECLARE brith VARCHAR(10) DEFAULT '1'; 
  declare randbrith int DEFAULT 1;
   #年级
  declare randgrade int DEFAULT 1;
  declare grade int DEFAULT 1;
  #手机号
  declare randtelBegin bigint DEFAULT 1;
  declare randtelEnd bigint DEFAULT 1;
  declare telBegin CHAR(3) DEFAULT '1';
  declare telEnd CHAR(8) DEFAULT '1';
  DECLARE tel CHAR(11) DEFAULT '1'; 
  #身份证
  declare card CHAR(18) DEFAULT '1';
  declare randcard bigint DEFAULT 1;
  #邮箱
  declare email CHAR(18) DEFAULT '1';
  declare randemail bigint DEFAULT 1;
   #地址
  declare address VARCHAR(50) DEFAULT '1';
  declare randAddress int DEFAULT 0;
  declare CiryCount int DEFAULT 0;

  WHILE Rows<=num DO
     #姓名
    select round(RAND()*399+1) INTO rand1;
    select Family INTO name1 from familyname where ID=rand1;
    select round(RAND()*399+1) INTO rand2;
    select Fname INTO name2 from fname where ID=rand2;
    SET namesum=CONCAT(name1,name2);
    # 性别
    select round(RAND()+1) INTO randsex;
      IF randsex=1 THEN
            SET sex='男';
      ELSEIF randsex=2 THEN
            SET sex='女';
      end if;
     #出生日期
    SELECT ROUND(RAND()*365*2+1) INTO randbrith;
    SELECT DATE_ADD('2000-01-01',INTERVAL randbrith DAY) INTO brith;
     #年级
    select round(RAND()*2+1) INTO randgrade; 
     IF randgrade=1 THEN
       SET grade=1;
     ELSEIF randgrade=2 THEN
       SET grade=2;
     ELSEIF randgrade=3 THEN
       SET grade=3;
     END IF;
    #手机号137 138  139  180 177 155 188 199 176
    select round(RAND()*8+1) INTO randtelBegin;
    IF randtelBegin=1 THEN
      SET telBegin='137';
    ELSEIF randtelBegin=2 THEN
     SET telBegin='138';
    ELSEIF randtelBegin=3 THEN
     SET telBegin='139';
    ELSEIF randtelBegin=4 THEN
     SET telBegin='180';
    ELSEIF randtelBegin=5 THEN
     SET telBegin='177';
    ELSEIF randtelBegin=6 THEN
     SET telBegin='155';
    ELSEIF randtelBegin=7 THEN
     SET telBegin='188';
    ELSEIF randtelBegin=8 THEN
     SET telBegin='199';
    ELSEIF randtelBegin=9 THEN
     SET telBegin='176';
    END IF; 
   select round(RAND()*89999999+10000000) INTO randtelEnd;
   SET telEnd= convert(randtelEnd,CHAR);
   SET tel=CONCAT(telBegin,telEnd);
  #身份证
  select round(RAND()*899999999999999+100000000000000) INTO randcard;
  SET card=CONCAT('430',CONVERT(randcard,CHAR));
  #邮箱
  select round(RAND()*89999999+10000000) INTO randemail;
  SET email=CONCAT(CONVERT(randemail,CHAR),'@qq.com');
   #地址
   select count(*) INTO CiryCount from area;
   SET randAddress=ROUND(RAND()*(CiryCount-1)+1);

    select CONCAT(province,city,area) INTO address from city
    INNER JOIN province e on city.father=e.provinceID 
    INNER JOIN area a on a.father=city.cityID
    WHERE a.id=randAddress
    GROUP BY areaID;
    #插入数据
    insert INTO stuinfo (stuName,stuSex,stuBirthDay,stuGrade,stuTel,stuIdentity,stuEmail,stuAdd) VALUES (namesum,sex,brith,grade,tel,card,email,address);
      set Rows=Rows+1;
    END WHILE;
    return '成功';
END;

3、插入数据

#执行函数
select fc_insert(1000000);

数据还算真实,姓名字段上还可以继续优化。

由于字数限制,地址数据字符太多发不出来,可下载SQL执行。

链接:https://pan.baidu.com/s/1xtN20zM6OWPQT9x31vaYGw 
提取码:nbsp

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值