64

別のデータベースからデータを転送する必要があります。古いデータベースは paw1.movi​​esDB と呼ばれ、新しいデータベースは paw1 です。各テーブルのスキーマは次のとおりです。

Awards (name of the table)(new DB)
Id [PK] Serial           Award

Nominations (name of the table) (old DB)
Id [PK] Serial           nominations

古いデータベースから新しいデータベースにデータをコピーするにはどうすればよいですか?

4

10 に答える 10

96

私はまさにこのことをしなければならなかったので、ここにレシピを投稿することにしました. これは、両方のデータベースが同じサーバー上にあることを前提としています。

まず、テーブルを古いデータベースから新しいデータベースにコピーします。コマンドラインで:

pg_dump -U postgres -t <old_table> <old_database> | psql -U postgres -d <new_database>

次に、コピーしたテーブルの権限を新しいデータベースのユーザーに付与します。psql にログインします。

psql -U postgres -d <new_database>

ALTER TABLE <old_table> OWNER TO <new_user>;

\q

この時点で、新しいデータベースにコピーされたテーブルには、<old_table>古いデータベースの名前がまだ残っています。データを別の場所、たとえば に移動すると仮定すると、<new_table>通常の SQL クエリを使用できます。

INSERT INTO <new_table> (field1, field2, field3) 
SELECT field1, field2, field3 from <old_table>;

終わり!

于 2012-03-29T16:35:38.993 に答える
42

データベースは PostgreSQL で分離されています。1 つのデータベースだけに接続する PostgreSQL サーバーに接続する場合、SQL クエリを使用してあるデータベースから別のデータベースにデータをコピーすることはできません。

MySQL から来た場合: MySQL が (大まかに) "データベース" と呼ぶものは、PostgreSQL の "スキーマ" - 一種の名前空間です。PostgreSQL データベースには多くのスキーマを含めることができ、それぞれにテーブルとビューがあり、次の構文を使用して 1 つのスキーマから別のスキーマにコピーできschema.tableます。

実際に 2 つの異なる PostgreSQL データベースがある場合、一方から他方にデータを転送する一般的な方法は、( を使用してpg_dump -t) テーブルをファイルにエクスポートし、もう一方のデータベースに ( を使用してpsql) インポートすることです。

個別の PostgreSQL データベースからデータを取得する必要がある場合、Grant Johnson の回答で言及されている別のオプションはdblinkです。これは追加のモジュールです ( 内contrib/)。

アップデート:

Postgres は 9.1 で「外部データ ラッパー」を導入しました (質問の後にリリースされました)。外部データ ラッパーを使用すると、 Postgres FDWを介して外部テーブルを作成できます。これにより、ローカル テーブルであるかのように (別のサーバーおよびデータベース上の) リモート テーブルにアクセスできます。

于 2010-06-16T01:07:44.287 に答える
13

From: hxxp://dbaspot.c om/postgresql/348627-pg_dump-t-give-where-condition.html (注: リンクは壊れています)

# create temp table with the data
psql mydb
CREATE TABLE temp1 (LIKE mytable);
INSERT INTO temp1 SELECT * FROM mytable WHERE myconditions;
\q

# export the data to a sql file
pg_dump --data-only --column-inserts -t temp1 mtdb > out.sql
psql mydb
DROP TABLE temp1;
\q

# import temp1 rows in another database
cat out.sql | psql -d [other_db]
psql other_db
INSERT INTO mytable (SELECT * FROM temp1);
DROP TABLE temp1;

リモートで役立つ別の方法

  # export a table csv and import in another database
  psql-remote> COPY elements TO '/tmp/elements.csv' DELIMITER ',' CSV HEADER;
  $ scp host.com:/tmp/elements.csv /tmp/elements.csv
  psql-local> COPY elements FROM '/tmp/elements.csv' DELIMITER ',' CSV;
于 2012-08-06T05:37:01.540 に答える
9

これが 1 回限りの場合、コピーするための 3 つのオプションがあります。

  1. db_link を使用します (まだ contrib にあると思います)
  2. アプリケーションに作業を行わせます。
  3. 輸出入

これが継続的なニーズである場合、答えは次のとおりです。

  1. 同一DB内のスキーマ変更
  2. db_link
于 2010-06-17T18:18:32.680 に答える
1

SQL Server のようなクロスデータベース クエリを実行することはできません。PostgreSQL はこれをサポートしていません。

PostgreSQL の DbLink 拡張機能は、あるデータベースを別のデータベースに接続するために使用されます。クロスデータベース クエリを実行するように DbLink をインストールして構成しました。

PostgreSQL でクロス データベース クエリを実行するためのステップ バイ ステップのスクリプトと例を既に作成しています。この投稿にアクセスしてください: PostgreSQL [ビデオ]: DbLink 拡張機能を使用したクロス データベース クエリ

于 2015-08-22T11:40:22.017 に答える
0

leonbloyが提案したように、データベースで2つのスキーマを使用するのが最善の方法です。ソーススキーマ(古いDB)とターゲットスキーマ(新しいDB)を想定すると、次のように試すことができます(列名、タイプなどを考慮する必要があります)。

INSERT INTO target.Awards SELECT * FROM source.Nominations;
于 2010-06-17T01:40:57.057 に答える