MySQL 存储过程批量插入总结

功能需求背景:今天接到产品经理核心业务表的数据压测功能,让我向核心业务表插入百万级的业务量数据,我首先想到的办法就是存储过程实现数据的批量


由于无法提供核心业务表,本文仅仅提供我刚刚自己创建的表bds_base_user 表做相关功能展示。

表DDL

CREATE TABLE `bds_base_user`(
    `id` varchar(64) NOT NULL,
    `age` int(11) DEFAULT'O',
    `name` varchar(64) NOT NULL,
    `amount` decimal(20,8) NOT NULL,
    PRIMARY KEY (id)
)ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

存储过程版本1.0 

create procedure proc_batch
begin
    declare i int default 0;
    declare uid varchar(64) default 
    declare uamount decimal(20,8) default 0;
    declare uage int default 0;
    declare uname varchar(64) default '';

    -- 定义SQL异常处理:主键重复
    declare continue handler for 1062 select 'duplicate key error encountered';

    -- 开启事务
    start transaction;
    -- 循环遍历
    --组装id
    select concat('1',ceiling(rand() * 9000000000 + 1000000000)) into uid;
    --组装age
    select floor(18 + (rand() * 9)) into uage;
    --组装amount
    select round((10 +(rand() * 1001)), 8) into uamount;
    --组装name
    select concat('测试账户',floor(rand()*11+10)) into uname;
   
    insert into bds _base_user(id, age, name, amount) values(uid, uage, uname, uamount);

    set i=i+1;
    if i % 1000 = 0 then
        commit;
    end if;
end while;
end

我在自己的座位上正在正常执行向核心业务表的注入数据的存储过程,产品经理火急火燎的跑过来通知我,批量注入的数据质量必须考虑。

存储过程版本2.0

目标: 主要解决模拟数据的质量问题,主要体现在:姓名、电话号码、邮箱、公司名称、家庭\公司住址、字段限定取值范围(涉及字符串和整形)、金额、 时间、系统主键和默认值等相关问题。

解决办法:采用自定义函数实现

自定义函数总结

集合生成和判断

-- 生成随机数1-3
select round(rand()*(3-0) + 0) from dual;

--指定集合随机获取
select el from(
select'新增' as el from dual
union all select '修改' from dual
union all select '删除' from dual
union all select '查询' from dual
)as temp
order by rand()
limit 1;

-- 判断指定字符串是否在指定集合范围内
select ifnull(count(1), 0) from(
select'新增' as el from dual
union all select '修改' from dual
union all select '删除' from dual
union all select '查询' from dual
)as temp where el ='测试'
-- 生成随机电话号码
select  concat('1',
   substring(cast(3 + (rand() * 10) % 7 AS char(50)), 1, 1),
   right(left(trim(cast(rand() AS char(50))), 11), 9));
-- 生成随机邮箱
select CONCAT( FLOOR(UNIX_TIMESTAMP()+10000000000*rand()),'@',ELT(CEILING(RAND( ) * 4) ,  "qq.com","163.com","sina.com","gmail.com")) 
-- 生成随机姓名
select concat(substring('赵钱孙李周吴郑王冯陈诸卫蒋沈韩杨朱秦尤许何吕施张孔曹严华金魏陶姜戚谢邹喻柏水窦章云苏潘葛奚范彭郎鲁韦昌马苗凤花方俞任袁柳酆鲍史唐费廉岑薛雷贺倪汤滕殷罗毕郝邬安常乐于时傅皮齐康伍余元卜顾孟平黄和穆萧尹姚邵堪汪祁毛禹狄米贝明臧计伏成戴谈宋茅庞熊纪舒屈项祝董粱杜阮蓝闵席季麻强贾路娄危江童颜郭梅盛林刁钟徐邱骆高夏蔡田樊胡凌霍虞万支柯咎管卢莫经房裘干解应宗丁宣贲邓郁单杭洪包诸左石崔吉钮龚',CEILING(190*rand()),1),substring('明国华建文平志伟东海强晓生光林小民永杰军金健一忠洪江福祥中正振勇耀春大宁亮宇兴宝少剑云学仁涛瑞飞鹏安亚泽世汉达卫利胜敏群波成荣新峰刚家龙德庆斌辉良玉俊立浩天宏子松克清长嘉红山贤阳乐锋智青跃元武广思雄锦威启昌铭维义宗英凯鸿森超坚旭政传康继翔栋仲权奇礼楠炜友年震鑫雷兵万星骏伦绍麟雨行才希彦兆贵源有景升惠臣慧开章润高佳虎根远力进泉茂毅富博霖顺信凡豪树和恩向道川彬柏磊敬书鸣芳培全炳基冠晖京欣廷哲保秋君劲轩帆若连勋祖锡吉崇钧田石奕发洲彪钢运伯满庭申湘皓承梓雪孟其潮冰怀鲁裕翰征谦航士尧标洁城寿枫革纯风化逸腾岳银鹤琳显焕来心凤睿勤延凌昊西羽百捷定琦圣佩麒虹如靖日咏会久昕黎桂玮燕可越彤雁孝宪萌颖艺夏桐月瑜沛诚夫声冬奎扬双坤镇楚水铁喜之迪泰方同滨邦先聪朝善非恒晋汝丹为晨乃秀岩辰洋然厚灿卓杨钰兰怡灵淇美琪亦晶舒菁真涵爽雅爱依静棋宜男蔚芝菲露娜珊雯淑曼萍珠诗璇琴素梅玲蕾艳紫珍丽仪梦倩伊茜妍碧芬儿岚婷菊妮媛莲娟一',CEILING(400*rand()),1),substring('明国华建文平志伟东海强晓生光林小民永杰军金健一忠洪江福祥中正振勇耀春大宁亮宇兴宝少剑云学仁涛瑞飞鹏安亚泽世汉达卫利胜敏群波成荣新峰刚家龙德庆斌辉良玉俊立浩天宏子松克清长嘉红山贤阳乐锋智青跃元武广思雄锦威启昌铭维义宗英凯鸿森超坚旭政传康继翔栋仲权奇礼楠炜友年震鑫雷兵万星骏伦绍麟雨行才希彦兆贵源有景升惠臣慧开章润高佳虎根远力进泉茂毅富博霖顺信凡豪树和恩向道川彬柏磊敬书鸣芳培全炳基冠晖京欣廷哲保秋君劲轩帆若连勋祖锡吉崇钧田石奕发洲彪钢运伯满庭申湘皓承梓雪孟其潮冰怀鲁裕翰征谦航士尧标洁城寿枫革纯风化逸腾岳银鹤琳显焕来心凤睿勤延凌昊西羽百捷定琦圣佩麒虹如靖日咏会久昕黎桂玮燕可越彤雁孝宪萌颖艺夏桐月瑜沛诚夫声冬奎扬双坤镇楚水铁喜之迪泰方同滨邦先聪朝善非恒晋汝丹为晨乃秀岩辰洋然厚灿卓杨钰兰怡灵淇美琪亦晶舒菁真涵爽雅爱依静棋宜男蔚芝菲露娜珊雯淑曼萍珠诗璇琴素梅玲蕾艳紫珍丽仪梦倩伊茜妍碧芬儿岚婷菊妮媛莲娟一',CEILING(400*rand()),1));
-- 生成随机省
SELECT ELT(CEILING(RAND( ) * 34) ,  "河北省","山西省","辽宁省","吉林省","黑龙江省","江苏省","浙江省","安徽省","福建省","江西省","山东省","河南省","湖北省","湖南省","广东省","海南省","四川省","贵州省","云南省","陕西省","甘肃省","青海省","台湾省","内蒙古自治区","广西壮族自治区","西藏自治区","宁夏回族自治区","新疆维吾尔自治区","北京市","上海市","天津市","重庆市","香港特别行政区","澳门特别行政区")
-- 生成随机市
SELECT ELT(CEILING(RAND( ) * 269) ,"石家庄","保定市","秦皇岛","唐山市","邯郸市","邢台市","沧州市","承德市","廊坊市","衡水市","张家口","太原市","大同市","阳泉市","长治市","临汾市","晋中市","运城市","晋城市","忻州市","朔州市","吕梁市","呼和浩特","呼伦贝尔","包头市","赤峰市","乌海市","通辽市","鄂尔多斯","乌兰察布","巴彦淖尔","盘锦市","鞍山市","抚顺市","本溪市","铁岭市","锦州市","丹东市","辽阳市","葫芦岛","阜新市","朝阳市","营口市","吉林市","通化市","白城市","四平市","辽源市","松原市","白山市","伊春市","牡丹江","大庆市","鸡西市","鹤岗市","绥化市","双鸭山","七台河","佳木斯","黑河市","齐齐哈尔市","无锡市","常州市","扬州市","徐州市","苏州市","连云港","盐城市","淮安市","宿迁市","镇江市","南通市","泰州市","绍兴市","温州市","湖州市","嘉兴市","台州市","金华市","舟山市","衢州市","丽水市","合肥市","芜湖市","亳州市","马鞍山","池州市","淮南市","淮北市","蚌埠市","巢湖市","安庆市","宿州市","宣城市","滁州市","黄山市","六安市","阜阳市","铜陵市","福州市","泉州市","漳州市","南平市","三明市","龙岩市","莆田市","宁德市","南昌市","赣州市","景德镇","九江市","萍乡市","新余市","抚州市","宜春市","上饶市","鹰潭市","吉安市","潍坊市","淄博市","威海市","枣庄市","泰安市","临沂市","东营市","济宁市","烟台市","菏泽市","日照市","德州市","聊城市","滨州市","莱芜市","郑州市","洛阳市","焦作市","商丘市","信阳市","新乡市","安阳市","开封市","漯河市","南阳市","鹤壁市","平顶山","濮阳市","许昌市","周口市","三门峡","驻马店","荆门市","咸宁市","襄樊市","荆州市","黄石市","宜昌市","随州市","鄂州市","孝感市","黄冈市","十堰市","长沙市","郴州市","娄底市","衡阳市","株洲市","湘潭市","岳阳市","常德市","邵阳市","益阳市","永州市","张家界","怀化市","江门市","佛山市","汕头市","湛江市","韶关市","中山市","珠海市","茂名市","肇庆市","阳江市","惠州市","潮州市","揭阳市","清远市","河源市","东莞市","汕尾市","云浮市","广西省:","南宁市","贺州市","柳州市","桂林市","梧州市","北海市","玉林市","钦州市","百色市","防城港","贵港市","河池市","崇左市","来宾市","海口市","三亚市","乐山市","雅安市","广安市","南充市","自贡市","泸州市","内江市","宜宾市","广元市","达州市","资阳市","绵阳市","眉山市","巴中市","攀枝花","遂宁市","德阳市","贵阳市","安顺市","遵义市","六盘水","昆明市","玉溪市","大理市","曲靖市","昭通市","保山市","丽江市","临沧市","拉萨市","阿里","咸阳市","榆林市","宝鸡市","铜川市","渭南市","汉中市","安康市","商洛市","延安市","兰州市","白银市","武威市","金昌市","平凉市","张掖市","嘉峪关","酒泉市","庆阳市","定西市","陇南市","天水市","西宁市","银川市","固原市","青铜峡市","石嘴山市","中卫市","乌鲁木齐","克拉玛依市")
-- 生成随机区/县
SELECT ELT(CEILING(RAND( ) * 23) ,  "朝阳区","海淀区","通州区","房山区","丰台区","昌平区","大兴区","顺义区","西城区","延庆县","石景山区","宣武区","怀柔区","崇文区","密云县","东城区","门头沟区","平谷区","江北区","渝北区","沙坪坝区","九龙坡区","万州区")
-- 生成随机1990 后30年
SELECT date( CONCAT(CEILING(30*RAND())+1990,'-',CEILING(12*RAND()),'-',CEILING(30*RAND())) )

创建生成主键函数:

delimiter //
create function fun_id()
	returns varchar(64)
begin
		return concat('10000',SUBSTR(md5(UUID()), 5));
end //
delimiter ;

select fun_id() from dual;

MySQL 8 执行遇到的报错:

This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you might want to use the less safe log_bin_trust_function_creators variable)

造成原因:MySQL 服务中/my.ini 配置中log_bin_trust_function_creators  变量默认为关闭,需要设置为开启。

方式1临时方案,MySQL服务重启会失效)
可以通过SQL语句设置,SQL语句如下:
1)查询变量值

show variables like 'log_bin_trust_function_creators';

 
2)设置变量值

set global log_bin_trust_function_creators = 1;

show variables like 'log_bin_trust_function_creators';


方式2永久方案,需要重启MySQL服务,配置才能生效)
在 my.cnf 配置文件中添加如下一行配置,然后重启MySQL服务

log_bin_trust_function_creators = 1

 创建随机生成家庭/公司地址函数

新增省、市、区/县和街道数据表。

-- bill.base_province definition

CREATE TABLE `base_province` (
  `id` int NOT NULL AUTO_INCREMENT,
  `code` varchar(100) NOT NULL,
  `name` varchar(100) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=32 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
-- bill.base_city definition

CREATE TABLE `base_city` (
  `id` int NOT NULL AUTO_INCREMENT,
  `code` varchar(64) NOT NULL,
  `name` varchar(64) NOT NULL,
  `province_code` varchar(64) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=343 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
-- bill.base_area definition

CREATE TABLE `base_area` (
  `id` int NOT NULL AUTO_INCREMENT,
  `code` varchar(64) NOT NULL,
  `name` varchar(64) NOT NULL,
  `city_code` varchar(64) NOT NULL,
  `province_code` varchar(64) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2979 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
-- bill.base_street definition

CREATE TABLE `base_street` (
  `id` int NOT NULL AUTO_INCREMENT,
  `code` varchar(64) NOT NULL,
  `name` varchar(64) NOT NULL,
  `arae_code` varchar(64) NOT NULL,
  `city_code` varchar(64) NOT NULL,
  `province_code` varchar(64) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=41353 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

数据来源请参考:Administrative-divisions-of-China

核心SQL:

SELECT 
    (select p.name  from base_province p where p.code = t1.province_code) as provinceName,
	(select c.name  from base_city c where c.code = t1.city_code) as cityName,
	(select a.name  from base_area a where a.code = t1.arae_code) as areaName,
	t1.name FROM base_street AS t1 JOIN 
(SELECT ROUND(RAND() * ((SELECT MAX(id) FROM base_street)-(SELECT MIN(id) FROM base_street ))+(SELECT MIN(id) FROM base_street)) AS id) AS t2 WHERE t1.id >= t2.id  
ORDER BY t1.id LIMIT 1 ;

效果截图:

最后用随机函数生成号数 ,至此完成随机生成地址信息。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/421431.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Vue3】深入理解Vue中的ref属性

💗💗💗欢迎来到我的博客,你将找到有关如何使用技术解决问题的文章,也会找到某个技术的学习路线。无论你是何种职业,我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章,也欢…

VSCode通过SSH连接Docker环境进行开发

文章目录 VSCode 插件Docker 镜像构建镜像部署环境 VSCode 连接本地Docker容器VSCode SSH连接Docker容器VSCode 打开容器内目录文件 VSCode 插件 Remote - SSH Docker 镜像 https://hub.docker.com/_/golang # Golang 镜像 docker pull golang:1.22构建镜像 Dockerfile F…

Shell条件判断

一、文件类型判断 示例: # 判断文件是否存在,存在为0, 不存在为1 [rootlocalhost ~]# test -e person.txt [rootlocalhost ~]# echo $? 0 [rootlocalhost ~]# [rootlocalhost ~]# test -e aba [rootlocalhost ~]# echo $? 1 # 出test外&am…

SaaS 电商设计 (九) 动态化且易扩展的实现购物车底部弹层(附:一套普适的线上功能切量的发布方案)

目录 一.背景1.1 业务背景1.2 技术负债 二.技术目标三.方案设计3.1 解决移动端频繁发版3.1.1 场景分析3.1.2 技术方案 3.2 减少后端坏味道代码&无法灵活扩展问题3.2.1 通过抽象接口完成各自单独楼层渲染逻辑3.2.2 通过配置能力做到部分字段可配 四.升级上线(普适于高并发大…

小程序实现定位城市切换且城市根据首字母A-Z排序后端数据实现逻辑

场景: 话不多说后端提供数据实现步骤: 1.controller层 Api(tags {"[地区]-城市相关接口"}) RestController RequestMapping("region") Slf4j public class RegionController extends BaseController {Resourceprivate RegionServ…

盲人出行:科技创造美好的未来

在繁忙的都市中,我每天都要面对许多挑战,盲人出行安全保障一直难以得到落实。我看不见这个世界,只能依靠触觉和听觉来感知周围的一切。然而,我从未放弃过对生活的热爱和对未来的憧憬。在一次机缘巧合下,我认识了一款名…

信息系统项目管理师--项目管理概述

开展项⽬是为了通过可交付成果达成⽬标。⽬标是所指向的结果、要取得的战略地位、要达到的⽬的、要获得的成果、要⽣产的产品或者要提供的服务。 可交付成果形成的独特并可验证的产品、成果或服务。可交付成果可能是有形的,也可能是⽆形的。产⽣⼀个或多个可交付成…

【ArcGIS】渔网分割提取栅格图+网格化分析图绘制

ArcGIS按渔网分割提取栅格图并绘制网格化分析图 准备数据操作步骤步骤1:创建渔网(Create Fishnet)步骤2:栅格数据处理步骤3:栅格插值步骤4:数据关联 参考 网格化的目的是让各个数据更加标准化的进行统计。因…

C语言-指针(上)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、pandas是什么?二、使用步骤 1.引入库2.读入数据总结 前言 本篇文章将为大家介绍C语言中的核心内容-指针,指针在C语言的中知识内容比…

全新挑战:微软 AI 奥德赛邀您全方位 Get AI 应用技能!

点击蓝字 关注我们 AI 风暴的火速席卷,大语言模型的不断迭代,在企业面临着机遇与挑战并存的新形势下,许许多多的个人也在经历着职业生涯的巨大压力与变革。在这场人工智能的浪潮之中,AI 技能无疑是我们破局焕新的关键利器。 为助力…

Dell R730 2U服务器实践3:安装英伟达上代专业AI训练Nvidia P4计算卡

Dell R730是一款非常流行的服务器,2U的机箱可以放入两张显卡,这次先用一张英伟达上代专业级AI训练卡:P4卡做实验,本文记录安装过程。 简洁步骤: 打开机箱将P4显卡插在4号槽位关闭机箱安装驱动 详细步骤: 对…

k8s单机部署zookeeper

(作者:陈玓玏) 拉取镜像:docker pull zookeeper;编辑yaml: apiVersion: v1 kind: Service metadata:name: zookeeperlabels:app: zookeeper spec:ports:- name: clientport: 2181protocol: TCPtargetP…

图片说话软件一览

目录 ~~tokkingheads~~~~myvoiceyourface~~~~avatarify~~wav2lip(值得研究) 最近刷到很多古画唱歌视频,搜了一下,好多教你怎么做的,今天来尝试了一下,感觉不咋地,就没有成功的 tokkingheads 网页一直转圈,…

Python环境下一种改进的基于梯度下降的自适应短时傅里叶变换

在数字信号处理技术中,傅里叶变换及其逆变换是一种信号时频分析方法。该方法将信号的时域描述及频域描述联系在一起,时域信号可通过正变换转变为频域信号,频域信号可通过逆变换转变为时域信号进行分析。但傅里叶变换及其逆变换是一种信号的整…

基于阿里云平台 通过树莓派实现 1:1人脸识别

之前的学习中,曾经在香橙派上使用阿里云平台的服务实现过类型识别: 使用香橙派并基于Linux实现最终版智能垃圾桶项目 --- 下_香橙派 项目-CSDN博客 现在,尝试在树莓派上通过阿里云平台的服务实现人脸识别! 通过VScode远程连接树莓…

EasyRecovery数据恢复软件2024最新版包括Windows和Mac

EasyRecovery数据恢复软件适用于多种环境和使用场景。首先,它适用于各种操作系统,包括Windows和Mac。无论用户使用的是哪种操作系统,都可以使用该软件进行数据恢复。 其次,EasyRecovery支持从各种存储设备和媒介中恢复数据&#…

iOS消息转发流程

当向Objc对象发送消息时,如果找到对象对应的方法,就会进入消息转发流程,给开发者提供一些最后的机会处理消息无法发送问题,以免出现程序崩溃。 1. 回调对象的resolveInstanceMethod方法,在这个方法中,允许开…

【图论】【并集查找】【C++算法】928. 尽量减少恶意软件的传播 II

作者推荐 动态规划的时间复杂度优化 涉及知识点 图论 并集查找 LeetCode928. 尽量减少恶意软件的传播 II 给定一个由 n 个节点组成的网络,用 n x n 个邻接矩阵 graph 表示。在节点网络中,只有当 graph[i][j] 1 时,节点 i 能够直接连接到…

JVM内存回收算法

1.1 引用计数法 每个对象创建的时候,会分配一个引用计数器,当这个对象被引用的时候计数器就加1,当不被引用或者引用失效的时候计数器就会减1。任何时候,对象的引用计数器值为0就说明这个对象不被使用了,就认为是“垃圾…

YOLO算法

YOLO介绍 YOLO,全称为You Only Look Once: Unified, Real-Time Object Detection,是一种实时目标检测算法。目标检测是计算机视觉领域的一个重要任务,它不仅需要识别图像中的物体类别,还需要确定它们的位置。与分类任务只关注对…
最新文章