lunes, 26 de marzo de 2012

Obtener el último registro insertado en una tabla en PostgreSQL

Podría parecer algo muy sencillo pero la verdad es que a veces puede no serlo tanto, sobretodo si no tuvimos en cuenta esto en el diseño de la BD. Según la tabla podemos encontrarnos con 2 posibilidades:

  • Tablas sin campo único autoincrementable
  • Tablas con campo único autoincrementable

Veamos cada una en detalle:


Tabla sin campo único autoincrementable


Si no incluimos un campo autoincrementable en la tabla, puede resultar muy tedioso ya que PostgreSQL reordena los datos cada que hay una actualización de un registro, por lo que no siempre obtendremos el listado en el mismo orden, pero dependiendo de la situación tenemos varias opciones:
  • Usar OIDs: Por defecto PostgreSQL agrega este campo 'oculto' a cada registro pero en la misma documentación vemos que no son fiables como identificador, además habría que habilitarlos al crear la tabla ya que desde la versión 8.1 los OIDs están deshabilitados por defecto.
    SELECT * FROM tabla ORDER BY oid DESC LIMIT 1;
  • Consulta inmediatamente después de insertar el registro: Apenas insertamos el registro podemos obtener el último registro con la siguiente consulta:
    SELECT * FROM tabla LIMIT 1;
    Pero no funcionará después de que se hagan otro tipo de actualizaciones sobre la tabla, así que tampoco sirve mucho.
  • Usar claúsula RETURNING en el INSERT: Igual que el anterior sólo sirve inmediatamente después de la inserción del registro.

Tabla con campo único autoincrementable


En este caso todo es mucho más sencillo. Suponiendo que el campo se llama id tenemos varias opciones según lo que querramos:
  • Obtener el último ID insertado mediante consulta: Si queremos conocer el último id insertado en la tabla usaremos la función agregada MAX:
    SELECT MAX(id) FROM tabla;
  • Obtener el último registro insertado: Si lo que queremos es la tupla completa, con varios o todos sus campos las consultas que usaremos son estas:
    SELECT * FROM tabla ORDER BY id DESC LIMIT 1;
    SELECT id, campo1, campo2 FROM tabla ORDER BY id DESC LIMIT 1;

    Esta consulta simplemente ordena por la llave primaria autoincrementable en orden descendente y entrega sólo un resultado.
  • Obtener el último ID insertado en una sesión de trabajo: Al estar vinculado con una secuencia cada campo autoincrementable (tipo SERIAL) podemos usar las funciones de manipulación de secuencias. De estas podemos usar la función lastval() que nos entregará el valor más reciente de cualquier secuencia en la sesión actual. De este modo podemos, por ejemplo, asignar su valor a una variable si estamos en una función:
    ultimo_id := lastval();

Por esta y otras razones es una buena práctica usar llaves primarias autoincrementables en las tablas.