Skip site navigation (1) Skip section navigation (2)

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 (view raw or flat)
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

pgsql-es-ayuda by date

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

Privacy Policy | About PostgreSQL
Copyright © 1996-2014 The PostgreSQL Global Development Group