Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

134
Vistas
Inserción condicional después de una actualización en una transacción

Tengo una consulta de 'actualización' de postgres en mi flujo comercial y un requisito de una parte interesada para producir una contabilidad más visible cuando la actualización sea exitosa, en forma de "insertar una línea en esta otra tabla" (... no discutamos las razones/la sabiduría detrás de este requisito).

Actualmente estoy implementando una composición de consultas en el código de la aplicación: update -> async returns to server -> was the count > 0 -> insert -> ok/ error handle + retry .

Dado que lo anterior no es lo más eficiente (2 viajes a la base de datos, posibles problemas de red, manejo de errores + reintentos involucrados), ¿puede emitirse potencialmente como una sola transacción? (El problema aquí es que una actualización de 0 filas no es un error, lo que complica aún más las cosas).

 pseudo-code BEGIN; UPDATE ....; IF (update_count > 0) THEN INSERT ...; COMMIT; ELSE ROLLBACK or RAISE;

No estoy particularmente familiarizado con CASE , WITH count AS (UPDATE) o RAISE , para poder componer el SQL que necesito, suponiendo que una solución como la que estoy describiendo sea viable.

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

PostgreSQL tiene una cláusula RETURNING que devuelve las filas afectadas por UPDATE o DELETE . Combine esto con CTE y podrá lograr su objetivo en una sola instrucción:

 begin; with do_update as ( update some_table set a = 1, b = 2, c =3 where id = 999 returning * ) insert into audit_table (affected_table, updated_at, update_user) select distinct 'some_table', now(), current_user from do_update ; commit;

La declaración INSERT tiene acceso a los resultados de la UPDATE a través del nombre CTE do_update . Si no se actualizaron filas, no se inserta nada en audit_table . Si se actualizan una o más filas, DISTINCT hace que se inserte una sola fila en audit_table .

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda