2016-03-27 8 views
0

Ich muss eine Tabelle auf meinem Server mit Daten aus einer anderen Tabelle (gleiche Spalten) auf einem anderen Server aktualisieren. Das Problem ist, dass ich zuerst die Tabelle wie im Beispiel danach reinigen möchte.postgresql - "Cut" -Tabellendaten

Bevor:

Tabelle 1 (Server 1)

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

Tabelle 2 (Server 2)

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

After:

Tabelle 1 (Server 1)

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

Tabelle 2 (Server 2)

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

Wie ich das erreiche, wenn Tabelle 1 wird alle paar Sekunden aktualisiert und Ich kann es mir nicht leisten, irgendwelche Daten zu verlieren?

Antwort

1

Dies ist wirklich ein erweiterter Kommentar.

Es scheint wie table2 ist eine Zusammenfassung von table1. Wenn Sie sie synchron halten möchten, sollten Sie einen update/insert Trigger auf table1 verwenden. Dieser Trigger würde:

  • Legen Sie eine neue Zeile in table2 wenn c1 nicht vorhanden.
  • Eine vorhandene Zeile in table2 aktualisieren, wenn c2 existiert.

Dieser Prozess hat einen Namen, "upsert". In mehreren Datenbanken wird eine Anweisung mit der Bezeichnung merge implementiert. Postgres bietet zwei weitere Methoden an.

Die erste ist etwas von der Form zu tun:

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

Das zweite ist, neue Funktionen in 9.5, die die on conflict-Klausel in der insert Anweisung (dokumentiert here) unterstützt.

Schließlich würde ich nicht empfehlen, Zeilen von table1 für jede Änderung zu löschen. Richten Sie stattdessen einen Job ein, der sie von Zeit zu Zeit löscht - einmal pro Stunde, Tag oder Woche. Löschen kann teuer sein und Sie möchten es tun, wenn das System nicht so beschäftigt ist.