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
INSERTuna nueva fila yUPDATEsi hubo un error. Desafortunadamente, el error deINSERTaborta la transacción actual.UPDATEla fila, y si no se modificaron filas,INSERTuna nueva fila.MySQL tiene una
ON DUPLICATE KEY UPDATEclá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.