CREATE SEQUENCE
CREATE SEQUENCE: definir un nuevo generador de secuencias.
importante
En PostgreSQL, especificar CACHE es opcional y el valor predeterminado es 1. En un sistema distribuido como Amazon Aurora DSQL, las operaciones de secuencia implican coordinación, y un tamaño de caché de 1 puede aumentar la sobrecarga de coordinación en condiciones de alta simultaneidad. Si bien los valores de caché más grandes permiten que los números de secuencia se sirvan desde rangos preasignados localmente, lo que mejora el rendimiento, los valores reservados no utilizados pueden perderse, lo que hace que las brechas y los efectos de ordenación sean más visibles. Dado que las aplicaciones difieren en su sensibilidad al orden de asignación frente al rendimiento, Amazon Aurora DSQL requiere que se especifique explícitamente CACHE y, actualmente, admite CACHE = 1 o CACHE >= 65536, lo que proporciona una clara distinción entre el comportamiento de asignación más cercano a la generación estrictamente secuencial y la asignación optimizada para cargas de trabajo altamente simultáneas.
Cuando CACHE >= 65536, los valores de secuencia siguen garantizando su unicidad, pero es posible que no se generen en estricto orden ascendente entre sesiones, y pueden producirse brechas, especialmente cuando los valores en caché no se consumen por completo. Estas características son coherentes con la semántica de PostgreSQL para secuencias en caché en uso simultáneo, donde ambos sistemas garantizan valores distintos, pero no garantizan un orden estrictamente secuencial entre sesiones.
Dentro de una misma sesión de cliente, es posible que los valores de secuencia no siempre aparezcan en estricto orden ascendente, especialmente fuera de transacciones explícitas. Este comportamiento es similar al de las implementaciones de PostgreSQL que utilizan agrupación de conexiones. Se puede lograr un comportamiento de asignación más cercano al de un entorno PostgreSQL de sesión única utilizando CACHE = 1 u obteniendo valores de secuencia dentro de transacciones explícitas.
Con CACHE = 1, la asignación de secuencias sigue el comportamiento de secuencias no en caché de PostgreSQL.
Para obtener orientación sobre cómo utilizar mejor las secuencias basadas en patrones de carga de trabajo, consulte Trabajar con secuencias y columnas de identidad.
Sintaxis admitida
CREATE SEQUENCE [ IF NOT EXISTS ] name CACHE cache [ AS data_type ] [ INCREMENT [ BY ] increment ] [ MINVALUE minvalue | NO MINVALUE ] [ MAXVALUE maxvalue | NO MAXVALUE ] [ [ NO ] CYCLE ] [ START [ WITH ] start ] [ OWNED BY { table_name.column_name | NONE } ] where data_type is BIGINT and cache = 1 or cache >= 65536
Descripción
CREATE SEQUENCE crea un nuevo generador de números de secuencia. Esto implica crear e inicializar una nueva tabla especial de una sola fila con el nombre name. El generador será propiedad del usuario que emita el comando.
Si se proporciona un nombre de esquema, la secuencia se crea en el esquema especificado. En caso contrario, se crea en el esquema actual. El nombre de la secuencia debe ser distinto del nombre de cualquier otra relación (tabla, secuencia, índice, vista, vista materializada o tabla externa) en el mismo esquema.
Una vez creada una secuencia, se utilizan las funciones nextval currval y setval para operar en la secuencia. Estas funciones están documentadas en Funciones de manipulación de secuencias.
Aunque no puede actualizar una secuencia directamente, puede utilizar una consulta como:
SELECT * FROM name;
para examinar algunos de los parámetros y el estado actual de una secuencia. En particular, el campo last_value de la secuencia muestra el último valor asignado por cualquier sesión. (Por supuesto, este valor podría estar obsoleto en el momento de su impresión, si otras sesiones están realizando llamadas de nextval de forma activa). En la vista pg_sequences se pueden observar otros parámetros, como increment y maxvalue.
Parameters
IF NOT EXISTS-
No se genera un error si ya existe una relación con el mismo nombre. En este caso, se emite un aviso. Tenga en cuenta que no hay garantía de que la relación existente sea similar a la secuencia que se habría creado; es posible que ni siquiera sea una secuencia.
name-
El nombre (opcionalmente calificado por el esquema) de la secuencia que se va a crear.
data_type-
La cláusula opcional
ASespecifica el tipo de datos de la secuencia. Los valores válidos sondata_typebigint.bigintes el valor predeterminado. El tipo de datos determina los valores mínimo y máximo predeterminados de la secuencia. incremento-
La cláusula opcional
INCREMENT BYespecifica qué valor se añade al valor de secuencia actual para crear un valor nuevo. Un valor positivo formará una secuencia ascendente y uno negativo una secuencia descendente. El valor predeterminado es 1.increment minvalue/NO MINVALUE-
La cláusula opcional
MINVALUEdetermina el valor mínimo que puede generar una secuencia. Si esta cláusula no se proporciona o se especificaminvalueNO MINVALUE, se utilizarán los valores predeterminados. El valor predeterminado para una secuencia ascendente es 1. El valor predeterminado para una secuencia descendente es el valor mínimo del tipo de datos. maxvalue/NO MAXVALUE-
La cláusula opcional
MAXVALUEdetermina el valor máximo para la secuencia. Si esta cláusula no se proporciona o se especificamaxvalueNO MAXVALUE, se utilizarán los valores predeterminados. El valor predeterminado para una secuencia ascendente es el valor máximo del tipo de datos. El valor predeterminado para una secuencia descendente es -1. CYCLE/NO CYCLE-
La opción
CYCLEpermite que la secuencia se repita cuando los valoresmaxvalueominvaluese han alcanzado mediante una secuencia ascendente o descendente, respectivamente. Si se alcanza el límite, el siguiente número generado será el valorminvalueomaxvalue, respectivamente.Si
NO CYCLEse especifica, cualquier llamada realizada anextvaldespués de que la secuencia haya alcanzado su valor máximo devolverá un error. SiCYCLEoNO CYCLEno se especifican,NO CYCLEes el valor predeterminado. iniciar-
La cláusula opcional
START WITHpermite que la secuencia comience en cualquier lugar. El valor inicial predeterminado esstartminvaluepara las secuencias ascendentes ymaxvaluepara las descendentes. cache-
La cláusula
CACHEespecifica cuántos números de secuencia se deben preasignar y almacenar en la memoria para un acceso más rápido. Los valores aceptables paracacheCACHEen Aurora DSQL son 1 o cualquier número >= 65536. El valor mínimo es 1 (solo se puede generar un valor a la vez, lo que significa que no caché). OWNED BY/table_name.column_nameOWNED BY NONE-
La opción
OWNED BYhace que la secuencia se asocie a una columna de tabla específica, de modo que si se elimina esa columna (o su tabla completa), la secuencia también se eliminará automáticamente. La tabla especificada debe tener el mismo propietario y estar en el mismo esquema que la secuenciaOWNED BY NONE, el valor predeterminado, especifica que no existe tal asociación.
Notas
Use DROP SEQUENCE para eliminar una secuencia.
Las secuencias se basan en la aritmética bigint, por lo que el rango no puede superar el rango de un entero de ocho bytes (-9223372036854775808 a 9223372036854775807).
Dado que las llamadas de nextval y setval nunca se revierten, los objetos de secuencia no se pueden utilizar si se necesita una asignación “sin brechas” de números de secuencia.
Cada sesión asignará y almacenará en caché valores de secuencia sucesivos durante un acceso al objeto de secuencia y aumentará el last_value del objeto de secuencia en consecuencia. A continuación, los siguientes usos de nextval en la caché-1 dentro de esa sesión simplemente devuelven los valores preasignados sin tocar el objeto de secuencia. De este modo, cualquier número asignado pero no utilizado dentro de una sesión se perderá cuando esta finalice, lo que provocará “huecos” en la secuencia.
Además, aunque se garantiza que las sesiones múltiples asignarán valores de secuencia distintos, los valores podrían generarse fuera de secuencia cuando se tienen en cuenta 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; a continuación, la sesión B podría reservar los valores 11..20 y devolver nextval=11 antes de que la sesión A genere nextval=2. Por lo tanto, con una configuración de caché de uno, es seguro suponer que los valores nextval se generan de forma secuencial; con una configuración de caché superior a uno, solo se debe suponer que los valores nextval son todos distintos, no que se generan de forma puramente secuencial. Además, last_value reflejará el último valor reservado por cualquier sesión, independientemente de si nextval ya lo ha devuelto.
Otra consideración es que un setval ejecutado en dicha secuencia no será detectado por otras sesiones hasta que hayan agotado los valores preasignados que tienen almacenados en caché.
Ejemplos
Cree una secuencia ascendente llamada de serial, empezando por 101:
CREATE SEQUENCE serial CACHE 65536 START 101;
Seleccione el siguiente número de esta secuencia:
SELECT nextval('serial'); nextval --------- 101
Seleccione el siguiente número de esta secuencia:
SELECT nextval('serial'); nextval --------- 102
Utilice esta secuencia en un comando INSERT:
INSERT INTO distributors VALUES (nextval('serial'), 'nothing');
Restablezca la secuencia a un valor específico usando setval:
SELECT setval('serial', 200); SELECT nextval('serial'); nextval --------- 201
Compatibilidad
CREATE SEQUENCE cumple con el estándar SQL con las siguientes excepciones:
-
La obtención del siguiente valor se realiza mediante la función
nextval()en lugar de la expresiónNEXT VALUE FORdel estándar. -
La cláusula
OWNED BYes una extensión de PostgreSQL.