¿Cómo ACTUALIZO, E una fila en una tabla o la INSERTO si no existe?

Tengo la siguiente tabla de contadores:

CREATE TABLE cache (
    key text PRIMARY KEY,
    generation int
);

Me gustaría incrementar uno de los contadores, o establecerlo en cero si la fila correspondiente aún no existe. ¿Hay alguna manera de hacer esto sin problemas de concurrencia en SQL estándar? La operación a veces es parte de una transacción, a veces por separado.

El SQL debe ejecutarse sin modificaciones en SQLite, PostgreSQL y MySQL, si es posible.

Una búsqueda arrojó varias ideas que sufren problemas de concurrencia o son específicas de una base de datos:

IntentarINSERT una nueva fila yUPDATE si hubo un error. Desafortunadamente, el error enINSERT aborta la transacción actual.

UPDATE la fila, y si no se modificaron filas,INSERT una nueva fila.

MySQL tiene unaON DUPLICATE KEY UPDATE cláusula.

EDIT: Gracias por todas las excelentes respuestas. Parece que Paul tiene razón, y no hay una sola forma portátil de hacer esto. Eso es bastante sorprendente para mí, ya que parece una operación muy básica.

Respuestas a la pregunta(10)

Su respuesta a la pregunta