实现数据表快速插入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);

查看插入数据

mysql 建表添加数据 mysql给表添加数据_mysql

其他实用函数

生成随机浮点数

该函数接收最小值 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$$