2011-11-05 114 views
3

完整的PostgreSQL newb。将结果从一个数据库中的PostgreSQL视图复制到另一个数据库中的表中

我有7-8个值的db1数据视图,我需要将数据复制到具有匹配schemae(模式?)的表中,并放在另一个数据库db2中。目标数据库可以是PostgreSQL的同一个实例,也可以是完全不同的盒子。

我知道2-3种不同的方式来完成这个与我熟悉的数据库,但我无奈这一个。有人能为我提出一些基本策略吗?

在一个完美的世界,我不希望做任何事情,感觉太ETL-ISH - 我宁愿做某种

SELECT FROM instance1.db1.viewname INTO instance2.db5.tablename 

然后倾倒出来的数据视图的文本文件并重新加载到目标表中。

虽然我不知道PostgreSQL,但我并不真正了解可能性范围内的内容。

+0

我会看看使用dblink。 –

+0

感谢你们俩。 dblink_connect看起来正是我所需要的。但是,看起来这个功能并没有自动安装在我刚刚放在我的盒子上的发行版中。是否需要从pgAdmin内部启动某种命令才能安装它? –

+0

没关系。发现它是一个扩展,我可以使用pgAdmin针对有问题的数据库进行安装。我正在运行。 –

回答

3

您不需要为COPY TO创建临时表。任何查询都可以是源自自PostgreSQL 8.2以来的

COPY (SELECT * FROM view1) TO '/var/lib/postgres/myfile1.csv'; 

阅读manual about COPY。在本地创建所需的表格

CREATE table tbl1 AS 
SELECT * FROM view1 
LIMIT 0; -- no data, just the schema. 

复制DDL指令并在目标数据库中创建所有表。 pgAdmin是一个方便的GUI。再次删除源数据库中的空表。加载数据与

COPY tbl1 FROM '/var/lib/postgres/myfile1.csv'; 

转储/恢复像@wildplasser描述它,是另一种方式。

对于一次转移,这些方法之一是明智的。对于重复应用,dblinkSQL/MED(外部数据管理)可能更合适。

+1

糟糕。我的错。但是复制一个视图文件仍然是不可能的:-) [这实际上是一个遗憾,因为规则系统允许构建可更新的视图] – wildplasser

3
CREATE TEMPORARY TABLE mytmp 
AS SELECT * from myview 
WHERE 1=1 
; 


COPY mytmp TO '/tmp/test.csv' 
; 

一个更好的方法是:

  • 副本意见纳入表(表1创建为SELECT * FROM厂景; ...)
  • 使用的pg_dump -t table1的-t表2。 .. mydbname> myfile.out
  • 使用myfile.out重新创建并填充表格。
+0

这种额外复制的原因是视图不能用作COPY语句的源或目标。创建表AS负责(大部分)数据类型。约束不会被复制到新表中。 – wildplasser

相关问题