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

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

时间:2023-11-03 17:05:26浏览次数:29  
标签:RAND VARCHAR rand 测试数据 数据表 num 随机 MySQL DECLARE

实现过程

创建表

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$$

标签:RAND,VARCHAR,rand,测试数据,数据表,num,随机,MySQL,DECLARE
From: https://blog.51cto.com/chencoding/8172828

相关文章

  • Linux环境Prometheus接入(三、MySQL监控接入mysqld_exporter)
    环境CentOS7.9安装1、命令下载wgethttps://github.com/prometheus/mysqld_exporter/releases/download/v0.15.0/mysqld_exporter-0.15.0.linux-amd64.tar.gztar-zxfmysqld_exporter-0.15.0.linux-amd64.tar.gzmvmysqld_exporter-0.15.0.linux-amd64.tar.gz/home/mysq......
  • rpm install MySQL
    yumremovemysql-libs按照依赖关系依次安装rpm包,依赖关系依次为common→libs→client→server。使用命令rpm-ivh{-file-name}进行安装操作。[root@node01mysql]#rpm-ivhmysql-community-common-5.7.36-1.el7.x86_64.rpmwarning:mysql-community-common-5.7.36-1.el......
  • Mysql 逻辑语句
    1、第一种写法selectid,casewhenp_idisnullthen"Root"whenidnotin(selectdistinctp_idfromTreewherep_idisnotnull)then"Leaf"else"Inner"endastype//为该列起别名fromTree 2、第二种写法(case后面有表达式;值1、值2......
  • mysql新建库&用户&授权
    1.创建数据库CREATEDATABASEccsacldbCHARACTERSETutf8mb4COLLATEutf8mb4_general_ci;2.创建用户CREATEUSER'usr_ccsacl'@'%'IDENTIFIEDBY'1qaz@WSX';3.授权#开发者权限GRANTSELECT,INSERT,UPDATE,DELETE,CREATE,ALTER,DROPONccsacldb.*TO�......
  • centos7源码安装MySQL 5
    安装前准备检查系统是否安装过mysql:rpm-qa|grepmysql查询所有mysql对应的文件夹,(人工判断不需要后)删除:whereismysqlfind/-namemysql卸载CentOS7系统自带mariadb:#查看系统自带的Mariadbrpm-qa|grepmariadb#卸载系统自带的Mariadbrpm-e--nodepsmariadb-libs#删......
  • mysql创建systemd管理项
    vim/usr/lib/systemd/system/mysqld.service写入system配置:[Unit]Description=MySQLServerDocumentation=mysqld##mysql参考手册Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.htmlAfter=network.targetAfter=syslog.target[Install]WantedBy=multi-u......
  • MySQL 数据库 cpu 飙升的话,要怎么处理?
    排查过程:(1)使用top命令观察,确定是mysqld导致还是其他原因。(2)如果是mysqld导致的,showprocesslist,查看session情况,确定是不是有消耗资源的sql在运行。(3)找出消耗高的sql,看看执行计划是否准确,索引是否缺失,数据量是否太大。处理:(1)kill掉这些线程(同时观察cpu使用率是......
  • mysql sql常用优化
    1 explain输出执行计划,检查orderby和where后边的字段是否建立索引2in()中的列不应过多,notin和in()数据过多都不再走索引,使用全表扫描,连续数值可以使用between1and33select后边指定字段,少用select(*)4 where子句中避免isnull/isnotnull5 应尽量避免在whe......
  • Mysql 唯一联合索引和 NULL允许重复
    我内心一直认为UNIQUEKEY是唯一的只允许出现一个null但是联合索引索引就打破了这个魔咒请看演示为null原因唯一索引的作用是确保组成索引的字段的值是唯一的。users唯一索引是由name、email和lebal字段组成的。users这三个字段的组合在表中已经存......
  • 安装MySQL初始化问题由于找不到VCRUNTIME140_1.dll,无法继续执行代码。重新安装程序可
    1.关于安装MySQL初始化遇到的问题出现的是如下图错误 这是安装mysql-8.0.25初始化的时候我遇到的报错解决方法如下:安装微软常用运行库合集[下载地址,没有积分的可以评论区联系我](https://download.csdn.net/download/qq_42603590/19686518)安装好之后就不会报错了好了之......