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

Responder a