2012-02-29 13 views
7

PostgreSQLの共通データベースに2つのデータベース(Database1 & Database2)をマージする必要があります。Postgresql:2つの同様のデータベースを結合する

Database1を

表1

イド - 値(Idは主キー)

1から
2 - AA
3 - AAA
4 - AAAA

データベース2

表1

同上値(Idはプライマリキーです)

2 - BB
5 - BBBBB

をOutPutDatabaseとして、私は私の出力をしたいです表1

同上値(Idはプライマリキーです)

1から
2 - BB
3 - AAA
4から
5 AAAA - BBBBB

どのように私はこれを達成することができますか?

+0

どのようにIDをマージされたデータベースに入れるべきかを決定していますか?重要ですか?これらのテーブルを参照する外部キーがありますか?もしそうなら、あなたは何をしたいのですか? –

答えて

7

まず、同じデータベース内の2つの別々のスキーマにテーブルをロードします。

CREATE SCHEMA db1; 
CREATE TABLE db1.table1 (id INT PRIMARY KEY, value VARCHAR(10)); 
-- load the contents of Table1 @ Database1 into db1.table1 

CREATE SCHEMA db2; 
CREATE TABLE db2.table1 (id INT PRIMARY KEY, value VARCHAR(10)); 
-- load the contents of Table1 @ Database2 into db2.table1 

次に、db1に優先順位を付けて、2つをマージすることができます。

SELECT 
    DISTINCT ON (id) 
    id, 
    value 
FROM (
    SELECT 
    *, 
    1 AS db 
    FROM 
    db1.table1 

    UNION 

    SELECT 
    *, 
    2 AS db 
    FROM 
    db2.table1) AS mix 
ORDER BY 
    id, 
    db DESC; 
0

私はテーブルをマージすることができるように異なる範囲に(異なるデータベースから同じスキーマが、異なる値を有する)複数のテーブルの主キーを移行するhereを定義migrate_pkey_sequence()関数を用います。

  1. ダンプd1それぞれのファイルd1.sql.gzd2.sql.gzからd2

    これは私がテーブルexampleをそれぞれ有する2つのデータベース、d1d2を、マージし、その後おおよその配列です。

    $ pg_dump --no-owner | gzip > d1.sql.gz 
    
  2. は、ローカルのPostgreSQLサーバ上の新しい空のデータベースを作成します。これは私がダンプするために使用されるコマンドです。

  3. ロードd1.sql.gz
  4. 移行d1.example使用:

    # SELECT migrate_pkey_sequence('example', 'id', 'example_id_seq', 1); 
    INFO: 00000: UPDATE example SET id = nextval('example_id_seq') + 0 
    INFO: 00000: ALTER SEQUENCE example_id_seq RESTART WITH 1 
    INFO: 00000: UPDATE example SET id = DEFAULT 
    migrate_pkey_sequence 
    ----------------------- 
            4 
    (1 row) 
    
  5. レコード(この例では4)プリント値。それが次のシーケンスの始まりになります。

  6. 上記と同じ方法でd1-new.sql.gzファイルにダンプします。
  7. 繰り返しd2.sql.gzで2〜4ステップが、migrate_pkey_sequence()引数としてステップ5からの値を使用する:

    # SELECT migrate_pkey_sequence('example', 'id', 'example_id_seq', 4); 
    
  8. ダンプファイルd2-new-without-schema.sql.gzにスキーマと無効トリガーを保存しません。これは私が使用するコマンドです:

    $ pg_dump --no-owner --data-only --disable-triggers | \ 
        gzip > d2-new-without-schema.sql.gz 
    
  9. は、新しい空のデータベースを作成します。

  10. ロードd1-new.sql.gzおよびd2-new-without-schema.sql.gzを順番に使用します。すべてが期待どおりに機能していれば、主キーは分離していて、矛盾していないはずです。

  11. リモートサーバーにロードする場合は、データベースをダンプします。

関連する問題