2016-03-27 25 views
0

Sunucumdaki bir tabloyu başka bir sunucudaki başka bir tablodaki (aynı sütunlar) verileriyle güncellemem gerekiyor. Sorun şu ki örnekte olduğu gibi daha sonra ilk tabloyu temizlemeyi istiyorum.postgresql - "cut" tablo verileri

önce:

Tablo 1 (sunucu 1)

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

Tablo 2 (sunucu 2)

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

sonra:

Tablo 1 (sunucu 1)

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

Tablo Bunu başarmak nasıl 2 (sunucu 2)

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

, Tablo 1 birkaç saniyede bir güncellenir ve eğer Herhangi bir veri kaybetmeyi göze alamıyorum?

cevap

1

Bu gerçekten genişletilmiş bir yorumdur.

table2table1'un bir özetidir.

Onları senkronize halde tutmak istiyorsanız, table1 numaralı telefondan update/insert tetikleyicisini kullanmalısınız. Bu tetikleyici olacaktır:

  • yok table2c1 eğer yeni bir satır ekler.
  • c2 mevcutsa, mevcut satırı table2 numaralı güncelleştirin.

Bu işlem bir "upsert" ismine sahiptir. Birkaç veritabanında, merge adlı bir deyim kullanarak uygulanmaktadır. Postgres iki farklı yöntem sunar.

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); 

ikinci insert açıklamada on conflict maddesini destekleyen 9.5 yeni bir işlevdir (here belgelenmiştir):

ilk formun bir şeyler yapmaktır.

Son olarak, her değişiklik için satırları table1'dan silmenizi tavsiye etmem. Bunun yerine, bunları bir zaman, gün veya haftada bir zaman zaman silen bir iş oluşturun. Silme pahalı olabilir ve sistem çok meşgul olmadığında bunu yapmak istersiniz.