2017-01-18 4 views
0

Ich versuche herauszufinden, wie man eine korrekte Upsert in Postgres in eine Tabelle, die eine Autoinkrement Primärschlüsselspalte namens "ID" und einen eindeutigen Schlüssel in der Spalte "Name" hat .Upsert in Postgres und automatische Inkrementierung Spalte

Das Problem ist, dass die Quell-und Zieltabellen sind auf 2 separaten Maschinen, so habe ich keine einfache Möglichkeit zu wissen, was die neueste "ID" ist in der Zieltabelle.

Die Art, wie ich es gerade mache, importiert die Daten aus der Zieltabelle in die Quellentabelle, sucht nach der höchsten "ID", aktualisiert die Tabelle in der Quelldatenbank und führt dann das Upsert in die Zieltabelle durch, aber wie Sie sehen können, scheint es zu kompliziert.

Ein Beispiel dafür, was ich tun möchte, ist:

Quelltabelle:

id status name 
1 ok John 
2 open Monica 

Zieltabelle:

id status name 
.  .  . 
.  .  . 
44 ok David 
45 open John 

Ergebnis der Upsert:

id status name 
.  .  . 
.  .  . 
44 ok David 
45 ok John 
46 open Monica 

Ein einfacher Upsert wird aufgrund der Spalte "id" einen doppelten Schlüsselkonflikt haben.

+1

warum fügst du nicht (status, name) ohne id ein, so würde sequenz sich um id kümmern? .. –

Antwort

0

Erstellen Sie auf der Zielseite eine fremde Tabelle für die Quellentabelle mit postgres_fdw.

Dann können Sie eine regelmäßige

INSERT INTO dest (status, name) 
    SELECT status, name FROM foreign_source 
    ON CONFLICT DO UPDATE 
    SET status = EXCLUDED.status, 
     name = EXCLUDED.name; 

verwenden Dies erfordert eine eindeutige Einschränkung auf status oder name oder beides.

+0

danke, es scheint, ich hatte tatsächlich ein problem mit meiner folge, aber ich stelle das als eine antwort da kann es sein helfen Sie jedem mit einer ähnlichen Frage die Wichtigkeit der Verwendung von ID in den Einfügewerten – johan855

Verwandte Themen