Un autoincremental en PostgreSQL, también conocido como secuencia, es un objeto especial que genera una secuencia de números comenzando desde el valor 1 a partir del ultimo numero que se ha generado. Este autoincremental o secuencia se suele utilizar como la clave primaria de las tablas.
Sintaxis
Para establecer un incremental como clave primaria al crear una tabla usa esta sintaxis:
CREATE TABLE nombre_tabla ( columna1 SERIAL PRIMARY KEY, columna2 tipo_dato );
Si la tabla ya la tienes creada, puedes usar esta sintaxis para crear una columna de tipo incremental y que sea la clave primaria:
ALTER TABLE nombre_tabla ADD COLUMN nombreColumna SERIAL PRIMARY KEY;
¿Cómo funciona?
Cuando se crea un campo de tipo serial PostgreSQL realiza las siguientes acciones:
- Crea una secuencia
- Agrega la restricción NOT NULL a la columna ya que siempre va tener valor numérico y le indica que por defecto el valor es el siguiente valor de la secuencia.
- Se asocia la secuencia a la columna, de este modo, si se borra la columna o la tabla se borrara la secuencia.
Estos tres pasos se realizan automáticamente cuando creas una columna de tipo serial, su sintaxis equivalente es la siguiente:
CREATE SEQUENCE nombre_tabla_id; CREATE TABLE nombre_tabla ( id integer NOT NULL DEFAULT nextval('nombre_tabla_id') ); ALTER SEQUENCE nombre_tabla_id OWNED BY nombre_tabla.id;
Tipos de serial
PostgreSQL nos proporciona tres tipos de objetos serial que funcionan de igual manera diferenciándose en el tamaño que soportan:
Nombre | Tamaño | Rango |
---|---|---|
SMALLSERIAL | 2 bytes | 1 a 32,767 |
SERIAL | 4 bytes | 1 a 2,147,483,647 |
BIGSERIAL | 8 bytes | 1 a 9,223,372,036,854,775,807 |
Importante
La operación de generar secuencias no es segura para las transacciones. Esto quiere decir que si se utiliza dos veces al mismo tiempo, por ejemplo dos clientes a la vez, se obtendrán resultados diferentes y si uno de ellos realiza un rollback es posible que se generen números no consecutivos.
Ejemplo
CREATE TABLE recursos ( id SERIAL PRIMARY KEY, nombre VARCHAR ); INSERT INTO recursos(nombre) VALUES('Metal'); select * from recursos;