Indices secuenciales en Postgresql

Jaime E. Villate

1 de Mayo de 2002

Postgresql no soporta la palabra clave auto_increment para crear un índice numérico que sea incrementado automáticamente. En su lugar existe un tipo de datos SERIAL propio de postgresql, que realiza la misma función. Por ejemplo, podemos crear una tabla de nombres así:

CREATE TABLE usuarios ("id" SERIAL, "name" TEXT);

Este comando creará automáticamente una sequencia con nombre "usuariosidseq". Tendremos que tener algún cuidado pues si decidimos borrar la tabla "usuarios", la secuencia asociada no se borra; tendremos que borrarla nosotros mismos.

Se pueden comenzar a rellenar los valores de los nombres, sin necesidad de dar números para "id", pues este será asignado automáticamente, comenzando con 1 y en forma secuencial. Si queremos que la secuencia comience con otro número, por ejemplo a partir de 100, deberemos alterar un campo en la secuencia auxiliar así:

SELECT setval('"usuarios_id_seq"',99,'t');

Si damos nosotros mismos un valor al campo "id" la secuencia no será actualizada. Por ejemplo si la secuencia iba en el número 45 e introducimos un registro con número 100, cuando intentemos introducir otro registro sin especificar número, le será asignado el índice 46 y nó el 101. Nuevamente podremos actualizar el valor de la secuencia manualmente con un comando SELECT como el de arriba.

Cuando borramos registros el valor de la secuencia tampoco se actualiza automáticamente. Por ejemplo si el valor del índice se encuentra en 91 y borramos los últimos tres registros (con índices 89, 90 y 91), el último registro será ahora el número 88, pero cuando intentemos crear un nuevo registro le será asignado un índice de 92 en vez de 89. Es necesario actualizar el valor del último índice manualmente: primero nos aseguramos del valor que tiene actualmente el índice secuencial así

SELECT last_value FROM usuarios_id_seq

que en el ejemplo anterior mostraría el valor 91. Para actualizarlo al valor correcto (88), usamos:

SELECT setval('"usuarios_id_seq"',88,'t');



Página creada en: 2004-11-04 11:41:02 +0000
© Copyright 2001, 2002, 2003, 2004, La Espiral, debian-laespiral@lists.debian.org
Permitida la copia y distribución textual, integral, siempre y cuando se mantenga este aviso.