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