由于在平时的工作中经常性的需要对PostgreSQL的一些功能进行验证,难免需要自建测试表及测试数据。虽然对于PostgreSQL生成测试数据有诸如BenchmarkSQL内嵌TPCC测试脚本,但很多情况下只是需要创建一部分自己所需要的数据结构,不需要使用BenchmarkSQL进行一系列麻烦的操作.
下面分享一下我平时用到的生成测试数据的一些方法.
此贴为持续更新篇,有好的方法会往上面加.
=============================================
基本函数
=============================================
random(): 获取0-1之间的随机数
ceil(value):得到不小于参数的最小整数
floor(value):得到不大于参数的最大整数
trunc(value): 截断小数点后的数(保留整数)
chr(value): 获取给定代码的字符(根据Unicode代码)
=============================================
方法示例
=============================================
获取1-10000之间的随机数
SELECT ceil(random()*(10000-1)+1) as num;
SELECT floor(random()*(10000-1)+1) as num;
SELECT trunc(random()*(10000-1)+1) as num;
获取100个1-10000之间的随机数,可能有重复数据
SELECT ceil(random()*(10000-1)+1) as num from generate_series(1,100);
获取100个1-10000之间的随机整数,没有重复数据
select num from generate_series(1,1000000) as t(num) order by random() limit 10;
生成100万数据,第一列整数,第二列8位文本
select id,substring(md5(id::varchar),2,8) from generate_series (1,1000000) as t(id)
select id,substring(md5(random()::varchar),2,8) from generate_series (1,1000000) as t(id)
=============================================
自定义函数
=============================================
生成随机时间戳
create or replace function get_random_timestamp(start_date date,end_date date) returns timestamp as
$BODY$
/*
* 功能:此函数为指定开始日期与结束日期,生成该范围类的随机时间戳
* 参数说明: start_date 为开始日期,end_data为结束日期
*/
declare
interval_days integer;
random_days integer;
random_date date;
result_date text; --处理后的随机日期字符串
result_time text; --随机时间字符串
begin
interval_days := end_date - start_date;
random_days := trunc(random() * (interval_days + 1));
random_date := start_date + random_days;
result_date := date_part('year',random_date)|| '-' || date_part('month',random_date)|| '-' || date_part('day',random_date);
result_time := (mod((random()*100)::integer,24)+1)||':'||(mod((random()*100)::integer,60)+1)||':'||(mod((random()*100)::integer,60)+1);
return to_timestamp(result_date||' '||result_time,'YYYY-MM-DD HH24:MI:SS');
end;
$BODY$ language plpgsql;
--获取指定date范围的时间戳
--SELECT get_random_timestamp('2020-01-01', '2020-01-05');
生成随机中文字符串
CREATE OR REPLACE FUNCTION get_random_chinese(integer) RETURNS text AS
$BODY$
/*
* 功能:根据传入的整数值随机生成指定字符个数的中文字符串
* 函数参数为指定每次生成的字符串中中文字符个数
* 中文的Unicode编码从19968开始*/
declare
complexity int; --控制中文字符复杂度,值越大,复杂度越高。建议不大于20901,可能出现字符无法解析
begin
complexity := 666;
if $1 >= 1 then
return string_agg(chr(19968+(random()*complexity)::int),'') from generate_series(1,$1);
end if;
return null;
end
$BODY$
LANGUAGE plpgsql
--生成两位的中文字符串
--select get_chinese_string(2);