Columnas que se auto-incrementan en PostgreSQL

11.12.09. Por ooscarr (ooscarr)

PostgreSQL

MySQL tiene la posibilidad de crear columnas que se auto-incrementan en la misma definición de la columna a travé del comando AUTO_INCREMENT, no así PostgreSQL. En Postgres es más complicado, y de esta manera lo hago yo.

1. Crear secuencia

Con pgAdmin III

pgAdmin3 es una aplicación multi-plataforma que sirve para administrar las bases de datos PostgreSQL hecha por la misma comunidad PostgreSQL. Si l quieres hacer por líneas de comandos, avanza un poco más en este artículo.

Una vez abierto el pgAdmnin3 y hecha la conexión:

  1. Expando mi base datos, mi Esquema, elijo con el botón secundario del mouse la sección Secuencias y elijo en el menú contextual la opción Nueva Secuencia...

    Menú contextual sobre las Secuencias de una base de datos PotgreSQL en pgAdmin3.

  2. En el formulario le pongo un nombre (en mi caso se llamará transferencias_id), el usuario que hará uso de esta secuencia (en mi caso, el usurio se llama ooscarr) y OK. También puedo elegir si quier que se auto-incremente a partir de un número diferente al 1 y/o si quiero que el número vaya aumentando de 2 en 2, 3 en 3, etc. en vez de 1 en 1 como se pone por defecto.

    Diálogo de secuencia nueva en pgAdminIII. Si sólo se llenan los campos Nombre y Propietario, PostgreSQL los llenará automáticamente con incremento de 1 en 1, desde el número 1, y le asignará una OID, etc, etc.

Lo mismo, desde la línea de comandos

si seleccionas la nueva secuencia que se agrega a la lista puedes ver el comando SQL que se utilizó para crearla. Lo mismo se pudo haber hecho desde la línea de comandos psql con:

CREATE SEQUENCE transferencias_id;

ó

CREATE SEQUENCE transferencias_id
  INCREMENT 1
  MINVALUE 1
  START 1
  CACHE 1;
ALTER TABLE transferencias_id OWNER TO ooscarr;

transferencias_id es el nombre que le asigné a la secuencia y ooscarr es el usuario de PostgreSQL que es dueño de esta variable auto-incrementable.

2. Usar la secuencia en una columna

Con pgAdmin3

  1. Expandemos la tabla que queremos modificar, expandemos Columnas, y seleccionamos la columna de la tabla que se deseas que se auto-incremente con esta variable, vas a las Propiedades....
  2. En el inspector de columna, le asignamos el Valor por defecto NEXTVAL('transferencias_id'). Siendo transferencias_id el nombre de la secuencia.

    Diálogo de Propiedades de columna en pgAdminIII, con el campo Valor por defecto NEXTVAL('transferencias_id').

  3. OK

Con comandos (psql)

Sería...

ALTER TABLE transferencias 
    ALTER COLUMN id 
        SET DEFAULT NEXTVAL('transferencias_id');

transferencias_id es el nombre de la secuencia, id es el nombre de la columna a asignarle la secuencia y transferencias es el nombre de mi tabla donde está la columna con al secuencia.

Actualizar filas anteriores sin la secuencia

Con comandos

Para cambiar los valores null de las filas creadas antes de la asignación de la variable auto-incrementable, consultamos:

UPDATE transferencias 
    SET id = NEXTVAL('transferencias_id');

Ese paso final es una de las cosas más lentas que puedes pedirle a Postgres que haga posiblemente. Para una tabla de tamaño mediano (alrededor de 5,000,000 tuplas, con unas cuantas columnas de pequeños números y textos), eso tomó cerca de 2.5 horas en hardware poderoso - así que querrás dejar esto por un tiempo tranquilo. Afortunadamente Postgres interpreta el UPDATE como una transacción atómica: nada se realiza hasta que el comando se complete, así será difícil que dejes los datos en un estado inconsistente.

Y ya con eso, cada vez que crees una nueva fila en esa tabla, esa columna se llenará automáticamente con un número distinto automáticamente.

Referencias

Artículos relacionados

Etiquetas: , ,

0 comentarios (RSS ATOM) :

Página principal

Publicidad