web-dev-qa-db-ja.com

PostgreSQLは、あるデータベースから別のデータベースにデータをコピー/転送します

テーブル間でデータをコピーする必要があります。 2つのテーブルの構造はほぼ同じですが、データベースは異なります。

私は試した

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

wenn私はこれを試します、データベース間でエラーが発生します...実装されていません

7
fabvys

これは本当に簡単な作業です。この目的で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')
16
voytech

それを行う別の方法もあります。 dblink拡張機能が利用できない場合は、標準入力と出力を接続するパイプを使用して、コマンドラインで直接データをコピーすることが可能です。

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

しかし、これはpostgres 9.4以降でのみ機能します

11
voytech

Psqlセッションでpostgresql 9.0以降(おそらく8.0以降)を使用している場合は、次も使用できます。

CREATE DATABASE new_database TEMPLATE original_database;

New_databaseは、テーブル、テーブルスキーマ、エンコーディング、データを含むoriginal_databaseのクローンになります。

ドキュメントから:

主な制限は、コピー中はソースデータベースに他のセッションを接続できないことです。

新旧のdbテーブルからの賢明な選択によって、クローンが実際に正しいことを確認することをお勧めします。ドキュメントはまた言う:

ただし、これは(まだ)汎用の「COPY DATABASE」機能としては意図されていないことを理解することが重要です。

2
dpneumo