INSERT ... ON CONFLICT: War es ein INSERT oder ein UPDATE?

Fragen und Probleme rund um die Abfragespache SQL.
Antworten
bb1898
Neuer Benutzer
Beiträge: 21
Registriert: Di 18. Aug 2009, 17:56

INSERT ... ON CONFLICT: War es ein INSERT oder ein UPDATE?

Beitrag von bb1898 » Di 16. Apr 2019, 22:00

Ich mache gerade die ersten Experimente mit INSERT und einer ON CONFLICT-Klausel. Klappt im Prinzip, nur: ich hätte gerne die Information, was denn nun passiert ist: ist ein neuer Satz entstanden oder ein vorhandener geändert worden? Das bekomme ich nicht hin und finde nichts dazu (Dokumentation, StackOverflow, dieses Forum, Suchmaschine mit "UPSERT" gefüttert).

Mein erster Gedanke war: RETURNING 'INSERTED' am Ende des INSERT-Befehls, vor der ON CONFLICT-Klausel, und RETURNING 'UPDATED' am Ende. Das ist syntaktisch falsch. Zweite Idee: RETURNING EXCLUDED.feldname am Ende, in der Hoffnung, dass das für UPDATE ein reguläres Ergebnis und für INSERT entweder NULL oder einen Fehler gibt. Gibt nur leider auch für UPDATE einen Fehler.

Ich bin überzeugt, dass die Information irgendwo in den Eingeweiden von PostgreSQL steckt und ich nur die richtige Stelle in der Dokumentation finden müsste - aber eben das gelingt mir nicht.

Der Vollständigkeit halber: PostgreSQL 11.2, Windows 10.

castorp
Erfahrener Benutzer
Beiträge: 1113
Registriert: Sa 27. Jun 2009, 22:24
Wohnort: Bayern

Re: INSERT ... ON CONFLICT: War es ein INSERT oder ein UPDATE?

Beitrag von castorp » Mi 17. Apr 2019, 07:52

So ganz trivial bzw. offensichtlich ist das nicht, aber das Problem hatten schon andere.

z.B. hier: https://stackoverflow.com/questions/40878027
A SQL query walks into a bar and sees two tables. He walks up to them and says 'Can I join you?'

bb1898
Neuer Benutzer
Beiträge: 21
Registriert: Di 18. Aug 2009, 17:56

Re: INSERT ... ON CONFLICT: War es ein INSERT oder ein UPDATE?

Beitrag von bb1898 » Do 18. Apr 2019, 20:16

Vielen Dank, das hat mir weitergeholfen. Meine eigene Suche in StackOverflow war bei weitem nicht gründlich genug. So richtig gut gefallen mir die beschriebenen Lösungen allerdings nicht. Wahrscheinlich passt im konkreten Fall der alte MySQL-Spruch "Das macht die Anwendung", weil es um Datensätze geht, die einzeln eingegeben bzw. bearbeitet werden. Da kann ich genau so gut und besser getrennte INSERT- und UPDATE-Befehle nehmen.

castorp
Erfahrener Benutzer
Beiträge: 1113
Registriert: Sa 27. Jun 2009, 22:24
Wohnort: Bayern

Re: INSERT ... ON CONFLICT: War es ein INSERT oder ein UPDATE?

Beitrag von castorp » Do 18. Apr 2019, 21:22

bb1898 hat geschrieben:
Do 18. Apr 2019, 20:16
So richtig gut gefallen mir die beschriebenen Lösungen allerdings nicht.
Warum nicht? Sie funktioniert und ist zuverlässig.
A SQL query walks into a bar and sees two tables. He walks up to them and says 'Can I join you?'

Antworten