¿Cómo PONER EN MARCHA (MEJORAR, INSERTAR ... EN ACTUALIZACIÓN DUPLICADA) en PostgreSQL?

Una pregunta muy frecuente aquí es cómo hacer una inserción, que es lo que llama MySQLINSERT ... ON DUPLICATE UPDATE y los soportes estándar como parte de laMERGE operación.

Dado que PostgreSQL no lo admite directamente (antes de la página 9.5), ¿cómo hace esto? Considera lo siguiente:

CREATE TABLE testtable (
    id integer PRIMARY KEY,
    somedata text NOT NULL
);

INSERT INTO testtable (id, somedata) VALUES
(1, 'fred'),
(2, 'bob');

Ahora imagina que quieres "sobrescribir" las tuplas(2, 'Joe'), (3, 'Alan'), por lo que los nuevos contenidos de la tabla serían:

(1, 'fred'),
(2, 'Joe'),    -- Changed value of existing tuple
(3, 'Alan')    -- Added new tuple

A eso se refiere la gente cuando se habla de unupsert. Crucialmente, cualquier enfoque debe serSeguro en presencia de múltiples transacciones trabajando en la misma tabla. - ya sea utilizando el bloqueo explícito, o defendiendo de otro modo contra las condiciones de carrera resultantes.

Este tema se discute ampliamente enInsertar, en la actualización duplicada en PostgreSQL?, pero se trata de alternativas a la sintaxis de MySQL, y ha crecido un poco de detalle no relacionado en el tiempo. Estoy trabajando en respuestas definitivas.

Estas técnicas también son útiles para "insertar si no existe, de lo contrario no hacer nada", es decir, "insertar ... ignorar la clave duplicada".

Respuestas a la pregunta(6)

Su respuesta a la pregunta