Tengo la siguiente tabla de contadores:
CREATE TABLE cache (
key text PRIMARY KEY,
generation int
);
Me gustaría incrementar uno de los contadores o ponerlo 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:
Intente con
INSERT
una nueva fila yUPDATE
si hubo un error. Desafortunadamente, el error deINSERT
aborta la transacción actual.UPDATE
la fila, y si no se modificaron filas,INSERT
una nueva fila.MySQL tiene una
ON DUPLICATE KEY UPDATE
cláusula.
EDITAR: Gracias por todas las excelentes respuestas. Parece que Paul tiene razón y no hay una forma única y portátil de hacer esto. Eso me sorprende bastante, ya que parece una operación muy básica.