Re: saber que filas se actualizaron o insertaron con upsert

From: Diego <mrstephenamell(at)gmail(dot)com>
To: Horacio Miranda <hmiranda(at)gmail(dot)com>, mauricio pullabuestan <jmauriciopb(at)yahoo(dot)es>, Postgres ayuda <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: saber que filas se actualizaron o insertaron con upsert
Date: 2020-01-15 12:01:46
Message-ID: a5db6aeb-ae87-3295-3c48-2cbeb5bb953e@gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Hola,

Lo que yo haria, seria algo tipo RETURNING p.id, p.lastaction  asi
podria tener no estaria trasmitiendo lo mismo que inserto o actualizo, y
asi determinaria que le paso a cada registro.

Porque, nunca supe de determinar la accion con el on conflict. y si
Alvaro no lo sabe, no se puede ;P

INSERT INTO public.prueba as p
(prb_id, nombre, lastaction)
SELECT x.prb_id, x.nombre, 'I'
  From json_to_recordset(_json) x
       (prb_id INTEGER, nombre VARCHAR)
ON CONFLICT (prb_id)
      DO UPDATE
         SET nombre = EXCLUDED.nombre, lastaction ='U'
RETURNING p.id, p.lastaction

On 14/1/20 18:45, Horacio Miranda wrote:
>
> On 15/01/2020 10:41 am, mauricio pullabuestan wrote:
>> Buen día
>>
>> Tengo una tabla a la cual envió un json para insertar o actualizar
>> registros, me interesa mediante returing insertar en una tabla
>> temporal los registros afectados y de alguna forma poder distinguir
>> cuales se insertaron o actualizaron para poder interactuar después.
>>
>> Alguna idea de como hacerlo?
>
> Yo haría un merge y con un trigger en un update insertar en una tabla
> de updates y otro trigger insertar los datos nuevos ( eso es lo que
> quieres ? ).
>
> Claro debe ser un after para no agregar latencia en la transacción.
>
>>
>> dejo un scrip de como estoy haciéndolo
>>
>> Saludos.
>> Mauricio
>>
>> do $$
>> DECLARE _json json;
>>
>> BEGIN
>>
>> _json = '[{"prb_id":1,"nombre":"iten
>> existe"},{"prb_id":2,"nombre":"iten No existe"}]';
>>
>> CREATE TEMP TABLE _rs On COMMIT DROP
>> As
>> WITH t
>> AS
>> (
>> INSERT INTO public.prueba as p
>> (prb_id, nombre)
>> SELECT x.prb_id, x.nombre
>>   From json_to_recordset(_json) x
>>        (prb_id INTEGER, nombre VARCHAR)
>> ON CONFLICT (prb_id)
>>       DO UPDATE
>>          SET nombre = EXCLUDED.nombre
>> RETURNING p.*
>> )
>> Select *
>>   From t;
>>
>> /*
>> Interactuar con registros nuevos
>>
>> Interactuar con registros editados
>> */
>>
>> END
>> $$;
>>
>> Select *
>>   From _rs;
>>
>>
>
>

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Diego 2020-01-15 12:07:54 Re: Que tan cierto es sobre este virus de postgresql..
Previous Message Horacio Miranda 2020-01-15 04:34:52 Re: Que tan cierto es sobre este virus de postgresql..