MySQL使用函数、存储过程实现:向数据表快速插入大量测试数据

news2024/10/2 16:29:54

实现数据表快速插入20W测试数据

  • 实现过程
    • 创建表
    • 开启允许创建函数
    • 生成随机字符串
    • 生成随机整数
    • 生成随机地址
    • 创建存储过程
    • 调用存储过程
    • 查看插入数据
  • 其他实用函数
    • 生成随机浮点数
    • 生成随机日期时间
    • 生成随机布尔值
    • 生成随机姓名
    • 生成随机手机号码
    • 生成随机邮箱地址
    • 生成随机IP地址
    • 生成随机文件名
    • 生成随机密码

实现过程

创建表

CREATE TABLE `user` (
	`id` INT(11) NOT NULL AUTO_INCREMENT,
	`name` VARCHAR(20) DEFAULT NULL,
	`age` INT(3) DEFAULT NULL,
	`pwd` VARCHAR(20) DEFAULT NULL,
	`address` VARCHAR(30) DEFAULT NULL,
	PRIMARY KEY (`id`)
) ENGINE=INNODB AUTO_INCREMENT=1;

开启允许创建函数

查看mysql是否允许创建函数:

SHOW VARIABLES LIKE 'log_bin_trust_function_creators';

开启允许创建函数设置:

global: 所有session都生效

SET GLOBAL log_bin_trust_function_creators=1; 

生成随机字符串

用于生成一个由随机字符组成的字符串,字符串的长度由参数 n 指定。该函数的作用是生成用于测试、演示或模拟目的的随机字符串。

DELIMITER $$
CREATE FUNCTION rand_string(n INT) RETURNS VARCHAR(255)
BEGIN    
	DECLARE chars_str VARCHAR(100) DEFAULT 'abcdefghijklmnopqrstuvwxyzABCDEFJHIJKLMNOPQRSTUVWXYZ';
	DECLARE return_str VARCHAR(255) DEFAULT '';
	DECLARE i INT DEFAULT 0;
	WHILE i < n DO  
		SET return_str =CONCAT(return_str,SUBSTRING(chars_str,FLOOR(1+RAND()*52),1));  
		SET i = i + 1;
	END WHILE;
	RETURN return_str;
END $$

函数主要逻辑:

1.定义一个包含所有可能字符的字符串 chars_str

2.初始化一个空字符串 return_str,用于存储生成的随机字符串

3.使用循环(WHILE)生成长度为 n 的随机字符串:
	通过FLOOR(1+RAND()*52)生成一个随机索引值,表示在可能字符字符串 chars_str 中取一个字符
	使用 SUBSTRING 函数从 chars_str 中提取一个字符
	将提取的字符添加到 return_str 中
	更新计数器 i 的值
	
4.循环结束后,返回生成的随机字符串 return_str

删除函数

drop function rand_string;

生成随机整数

用于生成一个随机整数,整数的范围由参数 from_num 和 to_num 指定。函数的作用是在指定的范围内生成一个随机整数。

DELIMITER $$
CREATE FUNCTION rand_num (from_num INT ,to_num INT) RETURNS INT(11)
BEGIN   
 DECLARE i INT DEFAULT 0;  
 SET i = FLOOR(from_num +RAND()*(to_num -from_num+1));
RETURN i;  
END$$

函数主要逻辑:

1.定义一个整数变量 i,初始化为 0

2.通过公式 FLOOR(from_num + RAND() * (to_num - from_num + 1)) 生成一个随机整数
	RAND() 返回一个范围为 [0, 1) 的随机小数
	(to_num - from_num + 1) 计算范围内的整数个数
	RAND() * (to_num - from_num + 1) 将随机小数映射到整数范围内
	from_num + RAND() * (to_num - from_num + 1) 将映射后的整数范围移动到指定的起始位置
	FLOOR(from_num + RAND() * (to_num - from_num + 1)) 取整,得到最终的随机整数

3.返回生成的随机整数 i

删除函数

drop function rand_num;

生成随机地址

该函数返回一个随机生成的地址,可以根据需求在函数内指定常见的城市和街道列表。

DELIMITER $$
CREATE FUNCTION rand_address() RETURNS VARCHAR(255)
BEGIN
    DECLARE cities VARCHAR(255) DEFAULT 'New York,Los Angeles,Chicago,Houston,Phoenix,Philadelphia,San Antonio,San Diego';
    DECLARE streets VARCHAR(255) DEFAULT 'Main St,First St,Second St,Maple Ave,Oak St,Pine St,Cedar Rd,Elm St';
    DECLARE city VARCHAR(255);
    DECLARE street VARCHAR(255);
    SET city = SUBSTRING_INDEX(SUBSTRING_INDEX(cities, ',', FLOOR(1 + RAND() * (LENGTH(cities) - 1))), ',', -1);
    SET street = SUBSTRING_INDEX(SUBSTRING_INDEX(streets, ',', FLOOR(1 + RAND() * (LENGTH(streets) - 1))), ',', -1);
    RETURN CONCAT(street, ', ', city);
END$$

函数主要逻辑:

1.声明四个变量:cities、streets、city和street。cities和streets变量分别保存城市和街道的名称列表,使用逗号进行分隔。city和street变量用于存储从列表中随机选取的城市和街道名称。

2.函数使用SUBSTRING_INDEX()函数和RAND()函数来随机选择一个城市和一个街道。
	    
    LENGTH(cities)-1:LENGTH(cities)返回城市名称列表cities的长度,减去1,得到列表中城市名称的数目
   
    RAND()*(LENGTH(cities)-1):RAND()返回一个范围为[0,1)的随机小数,将其乘以城市名称数目,得到一个从0到城市数目减1的随机小数值

    FLOOR(1+RAND()*(LENGTH(cities)-1)):将上一步得到的随机小数加1,并向下取整,得到一个从1到城市数目的整数值。这个整数值将作为随机选择城市名称的索引

    SUBSTRING_INDEX(cities,',',FLOOR(1+RAND()*(LENGTH(cities)-1))):使用SUBSTRING_INDEX()函数根据逗号分隔符,将城市名称列表cities按照随机索引截取,获取到从开头到随机索引的子字符串

    SUBSTRING_INDEX(SUBSTRING_INDEX(cities,',',FLOOR(1+RAND()*(LENGTH(cities)-1))),',',-1):在第4步得到的子字符串基础上,使用SUBSTRING_INDEX()函数再次截取,按照逗号分隔符从右向左获取到最后一个片段,即随机选择的城市名称

3.使用CONCAT()函数将选取的街道和城市名称以特定的格式进行拼接,形成最终的随机地址字符串。

创建存储过程

编写存储过程插入数据

CREATE DEFINER=`root`@`%` PROCEDURE `insert_user`(max_num INT)
BEGIN  
	DECLARE i INT DEFAULT 0;   
	# 把autocommit设置成0  
	SET autocommit = 0;    
	REPEAT  
		SET i = i + 1;  
		INSERT INTO user (`name`, age, pwd, address ) VALUES (rand_name(), rand_num(18,80), rand_string(12), rand_address());  
		UNTIL i = max_num  
	END REPEAT;  
	COMMIT;  
END

删除存储过程

DELIMITER ;
drop PROCEDURE insert_user;

调用存储过程

-- 执行存储过程,往表添加20万条数据
CALL insert_user(200000); 

查看插入数据

在这里插入图片描述

其他实用函数

生成随机浮点数

该函数接收最小值 min_val 和最大值 max_val 作为参数,返回在指定范围内生成的随机浮点数。

DELIMITER $$
CREATE FUNCTION rand_float(min_val FLOAT, max_val FLOAT) RETURNS FLOAT
BEGIN
    DECLARE rand_num FLOAT;
    SET rand_num = min_val + RAND() * (max_val - min_val);
    RETURN rand_num;
END$$

生成随机日期时间

该函数接收起始日期和结束日期作为参数,返回在指定范围内生成的随机日期时间。

DELIMITER $$
CREATE FUNCTION rand_datetime(start_date DATETIME, end_date DATETIME) RETURNS DATETIME
BEGIN
    DECLARE rand_datetime DATETIME;
    SET rand_datetime = start_date + INTERVAL FLOOR(RAND() * TIMESTAMPDIFF(SECOND, start_date, end_date)) SECOND;
    RETURN rand_datetime;
END$$

生成随机布尔值

该函数返回一个随机的布尔值(真或假)

DELIMITER $$
CREATE FUNCTION rand_boolean() RETURNS BOOLEAN
BEGIN
    RETURN RAND() < 0.5;
END$$

生成随机姓名

该函数返回一个随机生成的姓名,可根据需要在函数内指定常见的名字和姓氏列表。

DELIMITER $$
CREATE FUNCTION rand_name() RETURNS VARCHAR(255)
BEGIN
    DECLARE first_names VARCHAR(255) DEFAULT 'John,Mary,Michael,Sophia,James,Emma,William,Olivia';
    DECLARE last_names VARCHAR(255) DEFAULT 'Smith,Johnson,Williams,Jones,Brown,Taylor,Miller,Wilson';
    DECLARE first_name VARCHAR(255);
    DECLARE last_name VARCHAR(255);
    SET first_name = SUBSTRING_INDEX(SUBSTRING_INDEX(first_names, ',', FLOOR(1 + RAND() * (LENGTH(first_names) - 1))), ',', -1);
    SET last_name = SUBSTRING_INDEX(SUBSTRING_INDEX(last_names, ',', FLOOR(1 + RAND() * (LENGTH(last_names) - 1))), ',', -1);
    RETURN CONCAT(first_name, ' ', last_name);
END$$

生成随机手机号码

该函数返回一个随机生成的手机号码,前缀默认为 “1”,后缀为随机生成的位数。

DELIMITER $$
CREATE FUNCTION rand_phone_number() RETURNS VARCHAR(11)
BEGIN
    DECLARE prefix VARCHAR(1) DEFAULT '1';
    DECLARE suffix VARCHAR(10);
    SET suffix = LPAD(FLOOR(RAND() * 10000000000), 10, '0');
    RETURN CONCAT(prefix, suffix);
END$$

生成随机邮箱地址

该函数返回一个随机生成的邮箱地址,前缀长度通过参数 prefix_length 指定,默认为字母和数字的随机组合。

DELIMITER $$
CREATE FUNCTION rand_email(prefix_length INT) RETURNS VARCHAR(255)
BEGIN
    DECLARE domain VARCHAR(255) DEFAULT 'example.com';
    DECLARE prefix VARCHAR(255);
    SET prefix = CONCAT(SUBSTRING('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', FLOOR(1 + RAND() * 62), 1), 
                        SUBSTRING('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', FLOOR(1 + RAND() * 62), prefix_length - 1));
    RETURN CONCAT(prefix, '@', domain);
END$$

生成随机IP地址

该函数返回一个随机生成的 IP 地址,由 4 个随机生成的 0-255 之间的数字组成。

DELIMITER $$
CREATE FUNCTION rand_ip_address() RETURNS VARCHAR(20)
BEGIN
    DECLARE ip_address VARCHAR(20);
    SET ip_address = CONCAT(FLOOR(RAND() * 256), '.', FLOOR(RAND() * 256), '.', FLOOR(RAND() * 256), '.', FLOOR(RAND() * 256));
    RETURN ip_address;
END$$

生成随机文件名

该函数返回一个随机生成的指定长度和扩展名的文件名,文件名由字母和数字的随机组合构成。

DELIMITER $$
CREATE FUNCTION rand_file_name(length INT, extension VARCHAR(10)) RETURNS VARCHAR(255)
BEGIN
    DECLARE characters VARCHAR(255) DEFAULT 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
    DECLARE file_name VARCHAR(255);
    SET file_name = '';
    WHILE LENGTH(file_name) < length DO
        SET file_name = CONCAT(file_name, SUBSTRING(characters, FLOOR(1 + RAND() * 62), 1));
    END WHILE;
    SET file_name = CONCAT(file_name, '.', extension);
    RETURN file_name;
END$$

生成随机密码

该函数返回一个随机生成的密码,长度由参数 length 指定,默认为字母、数字和特殊字符的随机组合。

DELIMITER $$
CREATE FUNCTION rand_password(length INT) RETURNS VARCHAR(255)
BEGIN
    DECLARE characters VARCHAR(255) DEFAULT 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*';
    DECLARE password VARCHAR(255);
    SET password = '';
    WHILE LENGTH(password) < length DO
        SET password = CONCAT(password, SUBSTRING(characters, FLOOR(1 + RAND() * 70), 1));
    END WHILE;
    RETURN password;
END$$

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【代码随想录】算法训练营 第二天 第一章 数组 Part 2

977. 有序数组的平方 题目 暴力解法 思路 原地更新所有数组元素为其平方数后&#xff0c;再使用sort函数排序&#xff0c;对vector使用sort函数时&#xff0c;两个参数分别是vector的起始元素和终止元素。 代码 class Solution { public:vector<int> sortedSquares(…

Linux shell编程学习笔记11:关系运算

Linux Shell 脚本编程和其他编程语言一样&#xff0c;支持算数、关系、布尔、字符串、文件测试等多种运算。前面几节我们研究了 Linux shell编程 中的 字符串运算 和 算术运算&#xff0c;今天我们来研究 Linux shell编程中的的关系运算。 一、关系运算符功能说明 运算符说明…

LeetCode34 在排序数组中寻找元素的第一个和最后一个位置

题目&#xff1a; 思路&#xff1a; https://blog.csdn.net/wangjiaqi333/article/details/124526112 直观的思路肯定是从前往后遍历一遍。用两个变量记录第一次和最后一次遇见target的下标&#xff0c;但这个方法的时间复杂度为O(n)&#xff0c;没有利用到数组升序排列的条件…

50 二叉树中的最大路径和

二叉树中的最大路径和 题解1 DFS 二叉树中的 路径被定义为一条节点序列&#xff0c;序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次。该路径 至少包含一个节点&#xff0c;且不一定经过根节点。 路径和 是路径中各节点值的总和。 给你一个二…

Spring中PointcutAdvisor和IntroductionAdvisor梳理

一、Advisor Advisor是SpringAOP的顶层抽象&#xff0c;用来管理Advice和Pointcut 1、Advice也叫增强器 Spring中有五种增强&#xff1a;BeforeAdvide&#xff08;前置增强&#xff09;、AfterAdvice&#xff08;后置增强&#xff09;、RoundAdvice&#xff08;环绕增强&#…

论文导读 | 7月8月上旬MSOM文章精选

编者按 淘宝店承诺的交货时间早些还是晚些更有利&#xff1f; 波动的市场环境下如何进行分布式储能的选址与运营&#xff1f; 企业存在服务竞争时如何对待“共享库存”这一模式&#xff1f; 网约车平台在线派单时能否综合权衡司机资质、等待时间、订单远近等多种因素&#xff1…

供应链 | 在线平台系列解读(三):B2C 平台市场中物流战略与平台渠道结构设计之间的相互作用

论文解读&#xff1a;张怡雯&#xff0c;温梓曦&#xff0c;肖善&#xff0c;杨子豪 The interplay between logistics strategy and platform’s channel structure design in B2C platform market 原文作者信息 H. Liu, T. Xu, S. Jing, Z. Liu, S. Wang (2023) The interpl…

Java语法基础案例(二)

目录 案例六&#xff1a;抢红包 案例七&#xff1a;找素数 方法一&#xff1a; 方法二&#xff1a; 方法三&#xff1a; 案例八&#xff1a;实现双色球 关于本项目所用所有方法的解释&#xff1a; 案例六&#xff1a;抢红包 一个大V直播时发起了抢红包活动&#xff0c;分…

PyQt5 PyQt6 Designer 的安装

pip国内的一些镜像 阿里云 http://mirrors.aliyun.com/pypi/simple/ 中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/ 豆瓣(douban) http://pypi.douban.com/simple/ 清华大学 https://pypi.tuna.tsinghua.edu.cn/simple/ 中国科学技术大学 http://pypi.mirrors.ustc.…

力扣164最大间距

1.前言 因为昨天写了一个基数排序&#xff0c;今天我来写一道用基数排序实现的题解&#xff0c;希望可以帮助你理解基数排序。 这个题本身不难&#xff0c;就是线性时间和线性额外空间(O(n))的算法&#xff0c;有点难实现 基数排序的时间复杂度是O(d*(nradix))&#xff0c;其中…

HTML图片标签(2) HTML5+CSS3+移动web 前端开发入门笔记(三)

图片标签 HTML中&#xff0c;可以使用标签来插入图片。具体的语法为&#xff1a; <img src"图片路径" alt"替代文本">其中&#xff0c;src属性用于指定图片的路径&#xff0c;可以是相对路径或绝对路径。常见的有相对当前HTML文件的路径&#xff0…

Golang 实现接口和继承

小猴子继承了老猴子&#xff0c;这样老猴子拥有的能力包括字段&#xff0c;方法就会自动的被老猴子继承。 小猴子不需要做任何处理就可以拿到老猴子的字段和它的方法&#xff0c;因为是继承关系。 但是小猴子还会其他的技能&#xff0c;比如还会像小鸟一样飞翔&#xff0c;希…

国际减灾日 | 智慧减灾——百分点科技的数据科学视角

国际减轻自然灾害日简称“国际减灾日”&#xff0c;由联合国于1989年设立&#xff0c;旨在关注全球灾害风险&#xff0c;呼吁各国政府、组织和个人积极参与减灾工作&#xff0c;以保护人民生命财产安全。今年10月13日是第34个国际减灾日&#xff0c;主题为“共同打造有韧性的未…

卫星影像如何插入到AutoCAD使用

工具 Bigemap gis office地图软件 BIGEMAP GIS Office-全能版 Bigemap APP_卫星地图APP_高清卫星地图APP 第一步&#xff1a; 首先需要下载影像&#xff0c;选择一个区域下载&#xff0c;影像下载方式有以下几种&#xff1a; 那么通过下载方式选择好了范围以后&#xff0c;选…

【C++】-c++11的知识点(中)--lambda表达式,可变模板参数以及包装类(bind绑定)

&#x1f496;作者&#xff1a;小树苗渴望变成参天大树&#x1f388; &#x1f389;作者宣言&#xff1a;认真写好每一篇博客&#x1f4a4; &#x1f38a;作者gitee:gitee✨ &#x1f49e;作者专栏&#xff1a;C语言,数据结构初阶,Linux,C 动态规划算法&#x1f384; 如 果 你 …

基于Labview的噪声采集分析系

目录 摘 要......................................................................................................................... 3 第一章 绪论.............................................................................................................…

印尼全面禁止直播带货

我是卢松松&#xff0c;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; 电商的改变要来了? 印尼为了保护中小企业全面禁止电商&#xff0c;原因是&#xff1a;电商富的是少数人&#xff0c;只有实体才能带动经济。另外除了印尼&#xff0c;马来西亚、越南也要审查直播…

html设置前端加载动画

主体思路参考&#xff1a; 前端实现页面加载动画_边城仔的博客-CSDN博客 JS图片显示与隐藏案例_js控制图片显示隐藏-CSDN博客 1、编写load.css /* 显示加载场景 */ .loadBackGround{position: absolute;top: 0px;text-align: center;width: 100%;height: 100vh;background-c…

十六、【橡皮擦工具组】

文章目录 橡皮擦背景橡皮擦1. 一次取样2. 连续取样3. 取样背景色板 魔术橡皮擦 橡皮擦 橡皮擦跟我们平常生活中所用的橡皮擦是一样&#xff0c;它是将图层的内容擦除,只剩下空白部分。另外当我们按住Alt的键去擦除空白部分的时候&#xff0c;也可以将背景的部分显示出来。 另…

第三章 内存管理 二、内存管理的概念

目录 一、内存空间的分配与回收 内存空间的分配: 内存空间的回收&#xff1a; 二、内存空间的扩充 四、存储保护 五、总结 一、内存空间的分配与回收 内存空间的分配和回收是程序设计中非常重要的一环。这里简要介绍下内存空间的分配和回收。 内存空间的分配: 静态分配…