Estoy actualizando una base de datos Postgres 8.4 (desde el código C#) y la tarea básica es bastante simple: ACTUALIZAR una fila existente o INSERTAR una nueva si no lo hace t existir todavía Normalmente, me gustaría hacer esto:Postgres UPSERT (INSERT o UPDATE) solo si el valor es diferente
UPDATE my_table
SET value1 = :newvalue1, ..., updated_time = now(), updated_username = 'evgeny'
WHERE criteria1 = :criteria1 AND criteria2 = :criteria2
y si 0 filas afectadas luego hacer un INSERT:
INSERT INTO my_table(criteria1, criteria2, value1, ...)
VALUES (:criteria1, :criteria2, :newvalue1, ...)
Hay un pequeño giro, sin embargo. No deseo cambiar las columnas updated_time y updated_username a menos que alguno de los valores nuevos sea realmente diferente de los valores existentes para evitar confundir a los usuarios acerca de cuándo se actualizaron los datos.
Si solo estuviera haciendo una ACTUALIZACIÓN, entonces podría agregar DONDE las condiciones para los valores también, pero eso no funcionará aquí, porque si la base de datos ya está actualizada, la actualización afectará a 0 filas y luego lo haría intente INSERTAR.
¿Alguien puede pensar en una forma elegante de hacer esto, que no sea SELECCIONAR, y luego ACTUALIZAR o INSERTAR?
posible duplicado de [Insertar, en la actualización duplicada (postgresql)] (http://stackoverflow.com/questions/1109061/insert-on-duplicate-update-postgresql) –
No, no es un duplicado. La respuesta allí simplemente encapsula en una función lo que he escrito arriba. – EMP