¿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.