CREATE SEQUENCE

CREATE SEQUENCE — define un nuevo generador de secuencias

Synopsis

CREATE [ { TEMPORARY | TEMP } | UNLOGGED ] SEQUENCE [ IF NOT EXISTS ] nombre
    [ AS tipo_datos ]
    [ INCREMENT [ BY ] incremento ]
    [ MINVALUE valor_min | NO MINVALUE ] [ MAXVALUE valor_max | NO MAXVALUE ]
    [ [ NO ] CYCLE ]
    [ START [ WITH ] inicio ]
    [ CACHE caché ]
    [ OWNED BY { nombre_tabla.nombre_columna | NONE } ]

Descripción

CREATE SEQUENCE crea un nuevo generador de números de secuencia. Esto implica la creación e inicialización de una nueva tabla especial de una sola fila con el nombre especificado. El generador será propiedad del usuario que ejecute el comando.

Si se proporciona un nombre de esquema, la secuencia se crea en el esquema especificado. De lo contrario, se crea en el esquema actual. Las secuencias temporales existen en un esquema especial, por lo que no se puede proporcionar un nombre de esquema al crear una secuencia temporal. El nombre de la secuencia debe ser distinto del nombre de cualquier otra relación (tabla, secuencia, índice, vista, vista materializada o tabla foránea) en el mismo esquema.

Después de crear una secuencia, utilizas las funciones nextval, currval y setval para operar sobre ella. Estas funciones están documentadas en la Section 9.17.

Aunque no puedes actualizar una secuencia directamente, puedes usar una consulta como:

SELECT * FROM nombre;

para examinar los parámetros y el estado actual de la secuencia. En particular, el campo last_value de la secuencia muestra el último valor asignado por cualquier sesión. (Por supuesto, este valor puede estar obsoleto para el momento en que se imprima, si otras sesiones están realizando activamente llamadas a nextval).

Parámetros

TEMPORARY o TEMP

Si se especifica, el objeto de secuencia se crea solo para esta sesión y se elimina automáticamente al salir de la sesión. Las secuencias permanentes existentes con el mismo nombre no son visibles (en esta sesión) mientras exista la secuencia temporal, a menos que se haga referencia a ellas con nombres calificados por esquema.

UNLOGGED

Si se especifica, la secuencia se crea como una secuencia no registrada (unlogged). Los cambios en las secuencias no registradas no se escriben en el registro de escritura anticipada (write-ahead log). No son seguras contra fallos: una secuencia no registrada se restablece automáticamente a su estado inicial después de una caída del servidor o un apagado no limpio. Las secuencias no registradas tampoco se replican a los servidores en espera (standby).

A diferencia de las tablas no registradas, las secuencias no registradas no ofrecen una ventaja de rendimiento significativa. Esta opción está destinada principalmente a las secuencias asociadas con tablas no registradas a través de columnas de identidad o columnas serial. En esos casos, usualmente no tendría sentido que la secuencia sea registrada en el WAL y replicada, pero su tabla asociada no.

IF NOT EXISTS

No lanza un error si ya existe una relación con el mismo nombre. En este caso se emite un aviso. Ten en cuenta que no hay garantía de que la relación existente sea similar a la secuencia que se habría creado, e incluso podría no ser una secuencia.

nombre

El nombre (opcionalmente calificado por esquema) de la secuencia a crear.

tipo_datos

La cláusula opcional AS tipo_datos especifica el tipo de datos de la secuencia. Los tipos válidos son smallint, integer y bigint. bigint es el valor por omisión. El tipo de datos determina los valores mínimos y máximos predeterminados de la secuencia.

incremento

La cláusula opcional INCREMENT BY incremento especifica qué valor se suma al valor actual de la secuencia para crear un nuevo valor. Un valor positivo creará una secuencia ascendente, uno negativo una secuencia descendente. El valor por omisión es 1.

valor_min
NO MINVALUE

La cláusula opcional MINVALUE valor_min determina el valor mínimo que puede generar una secuencia. Si esta cláusula no se proporciona o se especifica NO MINVALUE, se usarán los valores por omisión. El valor por omisión para una secuencia ascendente es 1. El valor por omisión para una secuencia descendente es el valor mínimo del tipo de datos.

valor_max
NO MAXVALUE

La cláusula opcional MAXVALUE valor_max determina el valor máximo para la secuencia. Si esta cláusula no se proporciona o se especifica NO MAXVALUE, se usarán los valores por omisión. El valor por omisión para una secuencia ascendente es el valor máximo del tipo de datos. El valor por omisión para una secuencia descendente es -1.

CYCLE
NO CYCLE

La opción CYCLE permite que la secuencia vuelva a empezar (cicle) cuando el valor_max o el valor_min haya sido alcanzado por una secuencia ascendente o descendente, respectivamente. Si se alcanza el límite, el siguiente número generado será el valor_min o el valor_max, respectivamente.

Si se especifica NO CYCLE, cualquier llamada a nextval después de que la secuencia haya alcanzado su valor máximo devolverá un error. Si no se especifica CYCLE ni NO CYCLE, el valor por omisión es NO CYCLE.

inicio

La cláusula opcional START WITH inicio permite que la secuencia comience en cualquier lugar. El valor de inicio predeterminado es valor_min para las secuencias ascendentes y valor_max para las descendentes.

caché

La cláusula opcional CACHE caché especifica cuántos números de secuencia se van a preasignar y almacenar en memoria para un acceso más rápido. El valor mínimo es 1 (solo se puede generar un valor a la vez, es decir, sin caché), y este es también el valor por omisión.

OWNED BY nombre_tabla.nombre_columna
OWNED BY NONE

La opción OWNED BY hace que la secuencia se asocie con una columna de tabla específica, de modo que si esa columna (o toda la tabla) se elimina, la secuencia también se eliminará automáticamente. La tabla especificada debe tener el mismo propietario y estar en el mismo esquema que la secuencia. OWNED BY NONE, el valor por omisión, especifica que no existe tal asociación.

Notas

Utiliza DROP SEQUENCE para eliminar una secuencia.

Las secuencias se basan en aritmética de bigint, por lo que el rango no puede exceder el rango de un entero de ocho bytes (-9223372036854775808 a 9223372036854775807).

Debido a que las llamadas a nextval y setval nunca se revierten (rollback), los objetos de secuencia no se pueden usar si se necesita una asignación de números de secuencia sin huecos (gapless). Es posible construir una asignación sin huecos utilizando un bloqueo exclusivo de una tabla que contenga un contador; pero esta solución es mucho más costosa que los objetos de secuencia, especialmente si muchas transacciones necesitan números de secuencia concurrentemente.

Se pueden obtener resultados inesperados si se utiliza una configuración de caché mayor que uno para un objeto de secuencia que será usado concurrentemente por múltiples sesiones. Cada sesión asignará y almacenará en caché valores de secuencia sucesivos durante un acceso al objeto de secuencia e incrementará el last_value del objeto de secuencia en consecuencia. Luego, los siguientes caché-1 usos de nextval dentro de esa sesión simplemente devolverán los valores preasignados sin tocar el objeto de secuencia. Por lo tanto, cualquier número asignado pero no utilizado dentro de una sesión se perderá cuando esa sesión termine, lo que dará lugar a huecos en la secuencia.

Además, aunque se garantiza que múltiples sesiones asignarán valores de secuencia distintos, los valores pueden generarse desordenados cuando se consideran todas las sesiones. Por ejemplo, con una configuración de caché de 10, la sesión A podría reservar los valores 1..10 y devolver nextval=1, luego la sesión B podría reservar los valores 11..20 y devolver nextval=11 antes de que la sesión A haya generado nextval=2. Por lo tanto, con una configuración de caché de uno es seguro asumir que los valores de nextval se generan secuencialmente; con una configuración de caché mayor que uno solo debes asumir que los valores de nextval son todos distintos, no que se generan puramente de forma secuencial. Además, last_value reflejará el último valor reservado por cualquier sesión, se haya devuelto o no todavía por nextval.

Otra consideración es que un setval ejecutado en dicha secuencia no será notado por otras sesiones hasta que hayan agotado los valores preasignados que tienen almacenados en caché.

Ejemplos

Crea una secuencia ascendente llamada serial, comenzando en 101:

CREATE SEQUENCE serial START 101;

Selecciona el siguiente número de esta secuencia:

SELECT nextval('serial');

 nextval
---------
     101

Selecciona el siguiente número de esta secuencia:

SELECT nextval('serial');

 nextval
---------
     102

Usa esta secuencia en un comando INSERT:

INSERT INTO distributors VALUES (nextval('serial'), 'nothing');

Actualiza el valor de la secuencia después de un COPY FROM:

BEGIN;
COPY distributors FROM 'input_file';
SELECT setval('serial', max(id)) FROM distributors;
END;

Compatibilidad

CREATE SEQUENCE cumple con el estándar SQL, con las siguientes excepciones:

  • La obtención del siguiente valor se realiza utilizando la función nextval() en lugar de la expresión NEXT VALUE FOR del estándar.

  • La cláusula OWNED BY es una extensión de PostgreSQL.

Consulte también

ALTER SEQUENCE, DROP SEQUENCE