2016-03-27 6 views
0

別のサーバ上の別のテーブル(同じカラム)のデータでサーバ上のあるテーブルを更新する必要があります。問題は、例のように最初のテーブルを後でクリーニングしたいということです。postgresql - "cut"テーブルデータ

前:

表1(サーバ1)

c1 | c2 
--------- 
a | 10 
b | 20 

表2(サーバ2)

c1 | c2 
--------- 
b | 30 
c | 40 

後:

表1(サーバー1)

c1 | c2 
--------- 
<empty> --emptied 

表2(サーバー2)

c1 | c2 
--------- 
a | 10 --inserted 
b | 50 --updated 
c | 40 

表1が数秒ごとに更新された場合にどのように私は、それを達成しないとデータを失う余裕はないのですか?

答えて

1

これは実際には拡張されたコメントです。

table2table1の要約であるように思えます。

同期させたい場合は、table1update/insertトリガーを使用する必要があります。このトリガーはなります:c1が存在しない場合は

  • table2に新しい行を挿入します。
  • の既存行を更新し、c2が存在する場合は、table2に更新します。

このプロセスは、名前、 "アップサート" を持っています。いくつかのデータベースでは、mergeというステートメントを使用して実装しています。 Postgresには2つの方法があります。

with u as (
     update t2 
     set t2.c2 = new.c2 - coalesce(old.c2) 
     where t2.c1 = new.c1 
     returning * 
    ) 
insert into t2 (c1, c2) 
    select new.c1, new.c2 
    where not exists (select 1 from u); 

目はinsert文のon conflict句をサポートしています9.5の新機能がある(hereを文書化):

最初はフォームの何かを行うことです。

最後に、私はすべての変更のためにtable1から行を削除することをお勧めしません。代わりに、時々、時間、日、または週に1回削除するジョブを設定します。削除は高価になる可能性があります。システムが忙しくない場合は削除する必要があります。

関連する問題