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
Views: Raw Message | Whole Thread | Download mbox | Resend email
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

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Fernando Hevia 2009-12-18 19:31:08 RE: [pgsql-es-ayuda] URGENTE AYUDA PARA CONFIGURACION - HOLDEM MANAGER - En ESPAÑOL
Previous Message Alvaro Herrera 2009-12-18 19:06:28 Re: FATAL: el sistema de base de datos está en modo de recuperación