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


    实现过程

    创建表

    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;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    开启允许创建函数

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

    SHOW VARIABLES LIKE 'log_bin_trust_function_creators';
    
    • 1

    开启允许创建函数设置:

    global: 所有session都生效

    SET GLOBAL log_bin_trust_function_creators=1; 
    
    • 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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    函数主要逻辑:

    1.定义一个包含所有可能字符的字符串 chars_str
    
    2.初始化一个空字符串 return_str,用于存储生成的随机字符串
    
    3.使用循环(WHILE)生成长度为 n 的随机字符串:
    	通过FLOOR(1+RAND()*52)生成一个随机索引值,表示在可能字符字符串 chars_str 中取一个字符
    	使用 SUBSTRING 函数从 chars_str 中提取一个字符
    	将提取的字符添加到 return_str 中
    	更新计数器 i 的值
    	
    4.循环结束后,返回生成的随机字符串 return_str
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    删除函数

    drop function rand_string;
    
    • 1

    生成随机整数

    用于生成一个随机整数,整数的范围由参数 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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    函数主要逻辑:

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    删除函数

    drop function rand_num;
    
    • 1

    生成随机地址

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

    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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    函数主要逻辑:

    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()函数将选取的街道和城市名称以特定的格式进行拼接,形成最终的随机地址字符串。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    创建存储过程

    编写存储过程插入数据

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    删除存储过程

    DELIMITER ;
    drop PROCEDURE insert_user;
    
    • 1
    • 2

    调用存储过程

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

    查看插入数据

    在这里插入图片描述

    其他实用函数

    生成随机浮点数

    该函数接收最小值 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$$
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    生成随机日期时间

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

    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$$
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    生成随机布尔值

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

    DELIMITER $$
    CREATE FUNCTION rand_boolean() RETURNS BOOLEAN
    BEGIN
        RETURN RAND() < 0.5;
    END$$
    
    • 1
    • 2
    • 3
    • 4
    • 5

    生成随机姓名

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

    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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    生成随机手机号码

    该函数返回一个随机生成的手机号码,前缀默认为 “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$$
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    生成随机邮箱地址

    该函数返回一个随机生成的邮箱地址,前缀长度通过参数 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$$
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    生成随机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$$
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    生成随机文件名

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

    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$$
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    生成随机密码

    该函数返回一个随机生成的密码,长度由参数 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$$
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
  • 相关阅读:
    【无标题】
    如何将本地文件上传到Gitee
    http传输为什么是采用TCP传输
    VMware17Pro虚拟机安装macOS教程(超详细)
    Go Web---上
    推荐国产神器Eolink!API优先,Eolink领先!
    HTML简单介绍
    【JavaScript进阶之旅 ES6篇 第六章】函数默认值、this、箭头函数、箭头函数结合函数参数解构赋值、rest运算符
    Excelpoi导入导出--上完整代码!
    全志R128芯片应用开发案例——ADC驱动烟雾传感器
  • 原文地址:https://blog.csdn.net/qq_38628046/article/details/131009065