0

1にマージする必要がある2つのpostgresqlデータベースにデータがあります。明確にするために、両方のデータベースには、結合する必要がある特定の日付からの「適切な」データがあります。これは単にデータを別のデータに追加するだけではありません。つまり、テーブル foo にシリアル id フィールドがあるとします。両方のデータベースに ID=5555 の foo があり、両方の値が有効です (ただし異なります)。したがって、ターゲット データベースの foo は 5555 を保持し、新しいレコードは nextval(foo_id_seq) の新しい ID で追加されます。

だから、それは大混乱です。

私の考えは、ターゲット データベースに tmp スキーマを作成し、ソース データベースから必要なデータをコピーすることです。次に、基本的にデータを「アップサート」する必要があります。新しいアイデアで新しいレコードが挿入され (および外部キーが更新され)、両方のデータベースに存在するレコードが更新されます。

これに役立つツールがあるとは思いません。

私の質問。

新しい ID の生成を処理するにはどうすればよいですか? 選択を介して id 列を除外するだけでそれを実行できることはわかっていますが、それは大量の入力であり、遅くなります。私の考えは、挿入時に提供された ID をオーバーライドするこれらのテーブルの一時的なトリガーを作成することです。

最後に注意:

  • 両方のデータベースがオフラインです。そして、彼らにたどり着くことができるのは私だけです。
  • 両方のデータベースのスキーマはまったく同じです
  • ターゲット データベースは 9.2 です
4

1 に答える 1

0

次のようなものを使用してみてください:

INSERT INTO A(id, f1, f2)
SELECT nextval('A_seq'), tmp_A.f1, tmp_A.f2
FROM tmp_A
WHERE tmp_A.id IN (select A.id FROM A);

INSERT INTO A(id, f1, f2)
SELECT tmp_A.id, tmp_A.f1, tmp_A.f2
FROM tmp_A
WHERE tmp_A.id NOT IN (select A.id FROM A);

アイデア - 1 つを使用INSERT .. SELECT ..して id フィールドに競合のあるデータを挿入し、もう 1 つを使用して競合INSERT .. SELECT ..のないデータを挿入します。

またはid、挿入されたすべてのレコードに対して単純に new を生成します。

INSERT INTO A(id, f1, f2)
SELECT nextval('A_seq'), tmp_A.f1, tmp_A.f2
FROM tmp_A;
于 2013-10-08T15:56:14.287 に答える