天天看點

自定義腳本生成表測試資料(PostgreSQL)

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

繼續閱讀