MERGE-syntax verwendet, um UPSERT oder INSERT on duplicate UPDATE
Also ich komme aus der MySQL, wo ich das tun könnte INSERT on DUPLICATE UPDATE:
INSERT INTO table (a,b,c)
VALUES (1,2,3)
ON DUPLICATE KEY UPDATE c=c+1;
Aber jetzt bin ich mit PostgreSQL und es gibt Bemühungen zum hinzufügen von einem einfachen Beispiel: Funktionalität, sieht aus wie eine ZUSAMMENFÜHRUNG funktionieren könnte, für das, was ich gerne hätte, aber wollte sehen, ob dies ist die optimale syntax. Beispiel Syntax 1, Ich habe auch gesehen, diese aber nicht verstehen, wie das umzusetzen. Ich habe dies noch nicht ausprobiert, weil ich dachte, MERGE verwendet wurde für die Zusammenführung der Daten aus Tabelle1 in Tabelle2 oder würde so etwas funktionieren?
MERGE
INTO table
USING table
ON c = 1
WHEN MATCHED THEN
UPDATE
SET c=c+1
WHEN NOT MATCHED THEN
INSERT (a,b,c)
VALUES (1,2,3)
Irgendwelche anderen Vorschläge?
InformationsquelleAutor Phill Pafford | 2010-12-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
Bis MERGE verfügbar ist, verwenden Sie dieses robuste Ansatz: Insert on duplicate update in PostgreSQL?
MERGE ist auf der Todo für 9.1 wiki.postgresql.org/wiki/Todo
es gibt ein ruby-gem:
Upsert
InformationsquelleAutor Michael Buen
Bis merge unterstützt wird der einfachste Weg, IMO ist es einfach nur brechen Sie in zwei Abfragen:
where id geändert werden würde, um den entsprechenden Zustand.
hmm, funktioniert nicht im Test. gibt mir eine Fehlermeldung, die auf die WHERE-Bedingung
InformationsquelleAutor nate c
Der Schlüssel hier ist, dass anstelle der Zusammenführung in einer anderen Tabelle, die Sie erstellen, eine Konstante Tabelle source mit den
VALUES
Konstrukt in derUSING
- Klausel. Die genauen Zusammenführen von Regeln können Sie natürlich individuell auf den Geschmack.Siehe auch http://petereisentraut.blogspot.com/2010/05/merge-syntax.html.
Hmm ist das noch unterstützt?
patch ist 'warten auf den Autor' - commitfest.postgresql.org/action/commitfest_view/inprogress
InformationsquelleAutor Peter Eisentraut
Finde ich "ZUSAMMENFÜHREN" ist noch nicht in der Postgres-aber ist suposed werden in 9.1.
Möchte ich REGELs statt
Was Sie verlinkt haben ("Insert on duplicate update (postgresql)") ist im Grunde einige pgsql, dass Sie einspeisen der Daten. Ich denke, die REGEL ist eher elegant, da brauchen Sie nicht zu nennen Sie explizit und arbeiten Sie transparent im hintergrund, ohne die Notwendigkeit zu nennen, ein Verfahren in Ihrem tatsächlichen EINFÜGEN.
Es ist ein IGNORIEREN/ÜBERSPRINGEN, da Sie überprüfen Sie für die Existenz und wenn ja, überspringen Sie es. Funktioniert das gleiche für UPDATE-Aktionen. Betrachten Sie die Regeln als "eine Art Auslöser" , sind in der Lage, ändern Sie die Abfrage selbst schreiben oder (wie in diesem Fall) ignorieren von teilen (oder alle).
Ich Tat dies, aber der ALTE.id gab einen Fehler, der nicht wie der Wert. Irgendwelche Gedanken?
Das war eigentlich nur ein Beispiel. Sie schreiben, könnte jede Abfrage, die Sie wollen in der wo. Schauen Sie durch das Handbuch, siehe die Beispiele.
Anscheinend ist der metarow "ALTE" existiert nicht an Regeln EINFÜGEN, aber nicht für die UPDATE-Regeln. Habe noch nicht herausgefunden noch aber...
InformationsquelleAutor DrColossos