1. 随机生成姓名
1.1 函数
-- 开启允许创建
set global log_bin_trust_function_creators = 1;
-- 创建随机生成姓名 rand_name
delimiter $$
create function rand_name(n int) returns varchar(16)
begin
-- 初始化一个16姓氏字符串,作为姓氏字符库
declare family_str varchar (128) default '赵钱孙李周吴郑王冯陈蒋沈韩杨朱秦';
-- 初始化一个32名字字符串,作为名字字符库
declare name_str varchar (128) default '平书文若山向秋凡白斌绮烟从蕾天曼润又亦从语绮彤之玉凡梅依琴沛槐敏';
-- 记录当前是第几个
declare i int default 0;
-- 记录生成结果
declare full_name varchar(16) default '';
-- 随机名字1、2位标记
declare rand_num int DEFAULT 0;
while i < n do
-- 若获取多个姓名,则用逗号','区分
set full_name = if(i > 0, concat(full_name, ','), full_name);
-- 随机取姓氏
set full_name = concat(full_name, SUBSTR(family_str, floor(1+rand()*16), 1));
-- 随机取名字
set full_name = concat(full_name, SUBSTR(name_str, floor(1+rand()*16), 1));
-- 名字是否为双字
set rand_num = rand()*10;
set full_name = if(rand_num > 5, concat(full_name, SUBSTR(name_str, floor(1+rand()*16), 1)), full_name);
set i = i + 1;
end while;
return full_name;
end$$
delimiter ;
1.2 调用
rand_name(1);
2. 生成固定长度随机字符串
2.1 函数
delimiter $$
CREATE FUNCTION rand_string(n int) RETURNS varchar(255)
begin
declare chars_str varchar(100)
default "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
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()*62),1));
set i= i+1;
end while;
return return_str;
end $$
delimiter ;
2.2 调用
-- 传参为随机字符的长度
rand_string(20)
3. 随机数值
3.1 函数集
--随机生成 0~1 之间的小数(0<1)无需传参
RAND()
--向上取整,可嵌套RAND()使用
CEILING()
--向下取整,可嵌套RAND()使用
FLOOR()
--保留指定小数位数,可嵌套RAND()使用
ROUND()
--返回指定字符串的MD5值
MD5()
3.2 函数应用
ROUND()得到指定范围的随机数
round(rand()*(max - min)+ min)
FLOOR()得到指定范围的随机数
FLOOR(min + RAND() * (max – min + 1))
使用md5()产生32位随机字符串
--内层使用上述函数进行嵌套即可
MD5(RAND() * 10000)
4. 随机手机号
我国使用的手机号码为11位,其中每段编码代表含义不同:
前3位:网络识别号(运营商代码)
4到7位:归属地区代码
8到11位:用户代码
4.1 函数
delimiter $$
CREATE FUNCTION `random_mobile`() RETURNS char(11) CHARSET utf8
DETERMINISTIC
BEGIN
DECLARE head VARCHAR(100) DEFAULT '000,156,136,176,183';
DECLARE content CHAR(10) DEFAULT '0123456789';
DECLARE phone CHAR(11) DEFAULT substring(head, 1+(FLOOR(1 + (RAND() * 3))*4), 3);
DECLARE i int DEFAULT 1;
DECLARE len int DEFAULT LENGTH(content);
WHILE i<9 DO
SET i=i+1;
SET phone = CONCAT(phone, substring(content, floor(1 + RAND() * len), 1));
END WHILE;
RETURN phone;
END$$
delimiter ;
4.2 调用
random_mobile()
5. 随机日期
5.1 函数
DATE_ADD(date,INTERVAL expr type) # 给日期添加指定的时间间隔。
DATE_SUB(date,INTERVAL expr type) # 给日期减少指定的时间间隔
5.2 示例
update booking
set createTime=DATE_ADD('2021-01-01 00:00:00', INTERVAL FLOOR(1 + (RAND() * 18144000)) SECOND ) ;
5.3 补充说明
date : 指定的日期
INTERVAL : 关键字
expr:是具体的时间间隔
type:是时间单位。
注意:type可以复合型的,比如YEAR_MONTH
Type值 | 含义 |
---|---|
MICROSECOND | 间隔单位:毫秒 |
SECOND | 间隔单位:秒 |
MINUTE | 间隔单位:分钟 |
HOUR | 间隔单位:小时 |
DAY | 间隔单位:天 |
WEEK | 间隔单位:星期 |
MONTH | 间隔单位:月 |
QUARTER | 间隔单位:季度 |
YEAR | 间隔单位:年 |
SECOND_MICROSECOND | 复合型,间隔单位:秒、毫秒,expr可以用两个值来分别指定秒和毫秒 |
MINUTE_MICROSECOND | 复合型,间隔单位:分、毫秒 |
MINUTE_SECOND | 复合型,间隔单位:分、秒 |
HOUR_MICROSECOND | 复合型,间隔单位:小时、毫秒 |
HOUR_SECOND | 复合型,间隔单位:小时、秒 |
HOUR_MINUTE | 复合型,间隔单位:小时分 |
DAY_MICROSECOND | 复合型,间隔单位:天、毫秒 |
DAY_SECOND | 复合型,间隔单位:天、秒 |
DAY_MINUTE | 复合型,间隔单位:天、分 |
DAY_HOUR | 复合型,间隔单位:天、小时 |
YEAR_MONTH | 复合型,间隔单位:年、月 |
6. 批量往表中插入数据
示例
创建函数
delimiter $$
CREATE PROCEDURE `insert_data`(IN n int)
BEGIN
DECLARE i INT DEFAULT 1;
WHILE (i <= n ) DO
INSERT into customer_info (customer_name,customer_id,sex,certificate_type,id_number)
VALUEs (rand_name(1),rand_string(20),floor(1 + (rand() * 2)),floor(1 + (rand() * 2)),concat(floor(rand()*100000000000),UPPER(left(UUID(),3)),floor(rand()*100)));
set i=i+1;
END WHILE;
END $$
delimiter ;
插入10万条数据
call insert_data(1000000);