Postgres UPSERT (INSERT oder UPDATE) nur bei abweichendem Wert

Ich aktualisiere eine Postgres 8.4-Datenbank (aus C # -Code) und die grundlegende Aufgabe ist einfach genug: entweder eine vorhandene Zeile AKTUALISIEREN oder eine neue Zeile EINFÜGEN, falls noch keine vorhanden ist. Normalerweise würde ich das machen:

UPDATE my_table
SET value1 = :newvalue1, ..., updated_time = now(), updated_username = 'evgeny'
WHERE criteria1 = :criteria1 AND criteria2 = :criteria2

und wenn 0 Zeilen betroffen waren, dann mache ein INSERT:

INSERT INTO my_table(criteria1, criteria2, value1, ...)
VALUES (:criteria1, :criteria2, :newvalue1, ...)

Es gibt jedoch eine leichte Wendung. Ich möchte das @ nicht ände updated_time und updated_username -Spalten, es sei denn, einer der neuen Werte unterscheidet sich tatsächlich von den vorhandenen Werten, um zu vermeiden, dass Benutzer irregeführt werden, wann die Daten aktualisiert wurden.

Wenn ich nur ein UPDATE durchgeführt habe, könnte ich auch WHERE-Bedingungen für die Werte hinzufügen, aber das funktioniert hier nicht, denn wenn die DB bereits auf dem neuesten Stand ist, wirkt sich das UPDATE auf 0 Zeilen aus und dann würde ich versuchen, INSERT .

Kann jemand über eine elegante Möglichkeit nachdenken, außer SELECT, dann entweder UPDATE oder INSERT?

Antworten auf die Frage(10)

Ihre Antwort auf die Frage