Postgresql生成大量测试数据

在PostgreSQL中如何用简单的几条SQL语句生成大量的测试数据呢?

此处,我简单的写一个例子,经过测试的:

(1)准备知识

 

针对 Postgres生成数据方法

<1>生成序列====》           SELECT * FROM generate_series(1,5);

<2>生成date====》    SELECT date(generate_series(now(), now() + '1 week', '1 day'));

 

<3>生成integer 随机数=》 SELECT (random()*(2*10^9))::integer;

<4>生成numeric 随机数=》select (random()*100)::numeric(4,2);

<5>生成字符串==》    select substr('abcdefghijklmnopqrstuvwxyz',1,(random()*26)::integer);

<6>生成重复串==>    select repeat('1',(random()*40)::integer);

举例:

SELECT generate_series(1,10) as key,(random()*100.)::numeric(4,2),repeat('1',(random()*25)::integer) ORDER BY random();

 key | numeric |          repeat          
-----+---------+--------------------------
   8 |   26.04 | 111
  10 |   83.44 | 1
   9 |   46.72 |
   3 |   57.84 | 1111111111111
   4 |   29.61 | 1111111111111111111
   5 |   11.32 | 1111111111111
   7 |   69.69 |
   2 |   42.23 | 11111111111111111
   6 |   12.32 | 111111111111111111111111
   1 |   84.92 | 111111

二、

如果您想知道执行该sql的时间,请在执行上述命令前设置:
postgres=# \timing on
Timing is on.

(1)测试参考SQL,可以把生成的随机值改的大一些;

#生成新表===>

select i,'text:'||i as text into test from generate_series(1,10) as i;

#在新表中插入测试数据===>

insert into test(i,text) select i,'text:'||i from generate_series(1,10) as i;

(2)查看表test占用的存储空间

若查看其中的index的空间或整个relation的空间,请参考:

http://www.postgresql.org/docs/9.1/static/functions-admin.html

          或:http://www.postgresql.org/docs/9.1/static/functions-admin.html

(3)查看整个数据库占用的硬盘空间:

 

 

(4)如果想用delete清空该表,然后真正清空硬盘空间
 从上面的步骤可以看出,vacuumdb后空间回收数据又减少到最初的6.9M的空间了。
参考自:http://blog.csdn.net/cool_cr/article/details/31745145

创建表:

CREATE TABLE t_test(
  ID INT PRIMARY KEY   NOT NULL,
  NAME      TEXT  NOT NULL,
  AGE      INT   NOT NULL,
  ADDRESS    CHAR(50),
  SALARY     REAL
);

模拟批量插入:

insert into t_test SELECT generate_series(1,5000000) as key,repeat( chr(int4(random()*26)+65),4), (random()*(6^2))::integer,null,(random()*(10^4))::integer;

解释:

其中:

1、generate_series(1,5000000),表示生成一个数值序列,从1到5000000,步进为一。

generate_series作用可见下表:

 

2、repeat: 重复生成字符串的函数

repeat(s,n)返回一个由重复的字符串s组成的字符串,n表示重复生成的次数。若n<=0,则返回一个空字符串;若s或n为null,则返回null。

3、

select (random()*(6^2))::integer :随机数字 十位不超过6的两位数

select (random()*(10^4))::integer; 四位数

结果:

 

补充:postgresql 生成测试数据

此处,我简单的写一个例子,供参考(在Postgresql9.1下面做的):

(1)准备知识

针对 Postgres生成数据方法

生成序列

SELECT * FROM generate_series(1,5);

生成date

SELECT date(generate_series(now(), now() + "1 week", "1 day"));

生成integer 随机数

SELECT (random()*(2*10^9))::integer;

生成numeric 随机数

SELECT (random()*100.)::numeric(4,2);

生成字符串

SELECT substr("abcdefghijklmnopqrstuvwxyz",1,(random()*26)::integer);

生成重复串

SELECT repeat("1",(random()*40)::integer);

举例:

SELECT generate_series(1,10) as key,(random()*100.)::numeric(4,2),repeat("1",(random()*25)::integer) ORDER BY random();

结果:

 

-- 生成随机汉字符串  
create or replace function gen_hanzi(int) returns text as $$  
declare  
 res text;  
begin  
 if $1 >=1 then  
  select string_agg(chr(19968+(random()*20901)::int), "") into res from generate_series(1,$1);  
  return res;  
 end if;  
 return null;  
end;  
$$ language plpgsql strict; 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值