自定义脚本生成表测试数据(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$ 
        /* 
        * 功能:此函数为指定开始日期与结束日期,生成该范围类的随机时间戳
        * 参数说明: 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);
    

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Darion@pg

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值