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

Re: ultimo registro en postgres

From: Walter Negro <wnegro(at)vstour(dot)com>
To:
Cc: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: ultimo registro en postgres
Date: 2009-12-18 19:25:52
Message-ID: 4B2BD740.3000604@vstour.com (view raw or flat)
Thread:
Lists: pgsql-es-ayuda
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

In response to

Responses

pgsql-es-ayuda by date

Next:From: Fernando HeviaDate: 2009-12-18 19:31:08
Subject: RE: [pgsql-es-ayuda] URGENTE AYUDA PARA CONFIGURACIO?==?Windows-1252?Q?N - HOLDEM MANAGER - En ESPAÑOL
Previous:From: Alvaro HerreraDate: 2009-12-18 19:06:28
Subject: Re: FATAL?==?iso-8859-1?Q?: el sistema de base de datos está en modo de recuper?==?iso-8859-1?Q?ación

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