Re: ultimo registro en postgres

From: Walter Negro <wnegro(at)vstour(dot)com>
To: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: ultimo registro en postgres
Date: 2009-12-18 22:11:34
Message-ID: 4B2BFE16.2050605@vstour.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Un detalle más para agregar de la potencia de la clausula RETURNING es
que permite obtener lo que realmente se grabo para ese registro en esa
transacción de todos los campos que nos interese.
Campos incrementales, timestamp, valores por default, campos calculados
por disparadores, etc en definitiva, una diferencia muy importante y muy
útil.

Walter Negro

Walter Negro escribió:
> Hugo,
>
> Postgres tiene algo mejor para eso.
> En la misma instrucción del insert (por lo general para el caso que
> hablamos) o del update, se puede agregar la clausula RETURNING id
>
> INSERT INTO tabla (id,...)
> VALUES (...)
> RETURNING id
>
> Esto tiene una ventaja aún mayor que la de evitar una segunda consulta.
> Si agregas varios registros al mismo tiempo, obtienes una lista de
> todos los id que fueron asignados a los respectivos registros.
> En MySQL solamente obtenías el último y en caso de un insert multiple
> no podías asumir que los todos los registros hubieran tomado una
> numeración correlativa porque en insert concurrentes entre varios
> clientes, podrían ocurrir saltos.
>
> La clausula RETURNING retorna los valores como si hubieras hecho un
> SELECT id para los registros comprometidos en la transacción del INSERT.
>
> Por otra parte, SELECT
> CURRVAL(pg_get_serial_sequence('my_tbl','id_column')) no es un
> reemplazo eficaz de LAST_INSERT_ID(), ya que el comando de MySQL
> mantiene el último dato insertado para tu sesión, con lo cual el
> tiempo entre el INSERT y el SELECT puede ser grande y aún así obtener
> el valor correcto, pero la consulta en Postgres es sobre la tabla real
> y hay que tener en cuenta de que esta tabla no tiene transaccionalidad.
>
> Al decir que no tiene transaccionalidad, me refiero a que si un
> cliente hace 10 insert y paralelamente otro hace 10 insert, los
> números podrían repartirse entre las 2 transacciones.
> Si una de estas transacciones es cancelada, la numeración del
> incrementador no vuelve para atras y entre la finalización del INSERT
> y la ejecución del SELECT CURRVAL(...), el contador podría haber
> seguido incrementandose.
>
> La única forma segura en Postgres de reemplazar al LAST_INSERT_ID() es
> usar la cláusula RETURNING.
>
> Walter Negro
>
> Hugo A. Figueroa Solano escribió:
>>
>> Hace unos momentos escribi esto:
>>
>>
>>
>> > Hola, soy nuevo en esto de postgres y también en esta lista. Tengo una
>>
>> > duda con una migración de MySQL a postgres 8.4, ando buscando el
>>
>> > equivalente de MySQL SELECT LAST_INSERT_ID(). Alguna sugerencia?
>>
>>
>>
>> Pero lo mande mal :P, agradezco a Alvaro por la corrección. Ya
>> encontré la solución con lo siguiente:
>>
>> SELECT CURRVAL(pg_get_serial_sequence('my_tbl','id_column'))
>>
>>
>>
>> Espero que le sirva a alguien mas (Novato como yo).
>>
>>
>>
>> __________ Información de NOD32, revisión 4699 (20091218) __________
>>
>> Este mensaje ha sido analizado con NOD32 antivirus system
>> http://www.nod32.com
>>
>>
>> __________ Información de NOD32, revisión 4699 (20091218) __________
>>
>> Este mensaje ha sido analizado con NOD32 antivirus system
>> http://www.nod32.com
>
>
> __________ Información de NOD32, revisión 4700 (20091218) __________
>
> Este mensaje ha sido analizado con NOD32 antivirus system
> http://www.nod32.com
>
>
> __________ Información de NOD32, revisión 4700 (20091218) __________
>
> Este mensaje ha sido analizado con NOD32 antivirus system
> http://www.nod32.com

In response to

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Alvaro Herrera 2009-12-18 22:26:23 Re: ultimo registro en postgres
Previous Message yanguma 2009-12-18 21:37:31 Re: RESTRICION FUNCION COPY