CREATE SEQUENCE — define un nuevo generador de secuencias
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 } ]
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).
TEMPORARY o TEMPSi 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.
UNLOGGEDSi 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 EXISTSNo 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.
nombreEl nombre (opcionalmente calificado por esquema) de la secuencia a crear.
tipo_datos
La cláusula opcional AS
especifica el tipo de datos de la secuencia. Los tipos válidos son tipo_datossmallint,
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
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.
incremento
valor_minNO MINVALUE
La cláusula opcional MINVALUE
determina el valor mínimo que puede generar una secuencia. Si esta cláusula no se proporciona
o se especifica valor_minNO 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_maxNO MAXVALUE
La cláusula opcional MAXVALUE
determina el valor máximo para la secuencia. Si esta cláusula no se proporciona o se especifica
valor_maxNO 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.
CYCLENO 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
permite que la secuencia comience en cualquier lugar. El valor de inicio predeterminado es
iniciovalor_min para las secuencias ascendentes y
valor_max para las descendentes.
caché
La cláusula opcional CACHE
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.
caché
OWNED BY nombre_tabla.nombre_columnaOWNED 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.
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é.
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;
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.