19

我需要将数据从一个表复制到另一个表。这两个表具有几乎相同的结构,但位于不同的数据库中。

我试过了

INSERT INTO db1.public.table2(
  id,
  name,
  adress,
  lat,
  lng
)
SELECT
  id,
  name,
  adress,
  lat
  lng
FROM db2.public.table2;

wenn 我试试这个,我得到错误跨数据库...未实现

4

3 回答 3

31

这是一个非常简单的任务。只需为此目的使用 dblink:

INSERT INTO t(a, b, c)
SELECT a, b, c FROM dblink('host=xxx user=xxx password=xxx dbname=xxx', 'SELECT a, b, c FROM t') AS x(a integer, b integer, c integer)

如果您需要定期从外部数据库获取数据,定义服务器和用户映射是明智的。然后,您可以使用更短的语句:

dblink('yourdbname', 'your query')
于 2016-04-07T12:55:08.573 回答
18

还有另一种方法。如果 dblink 扩展不可用,可以直接在命令行中复制数据,使用管道连接标准输入和输出:

psql source_database -c 'COPY table TO stdout' | psql target_database -c 'COPY table FROM stdin'

但这仅适用于 postgres 9.4 或更高版本

于 2016-04-08T09:43:53.013 回答
5

如果您在 psql 会话中使用的是 postgresql 9.0 或更高版本(可能是 8.0 或更高版本),您还可以使用:

CREATE DATABASE new_database TEMPLATE original_database;

new_database 将是 original_database 的克隆,包括表、表模式、编码和数据。

从文档:

主要限制是在复制源数据库时没有其他会话可以连接到源数据库。

我建议您通过从新旧数据库表中进行明智的选择来验证克隆实际上是否正确。文档还说:

然而,重要的是要理解,这(还)不打算用作通用的“复制数据库”工具。

于 2017-01-28T17:23:57.287 回答