由于在平時的工作中經常性的需要對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$
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$
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);