CREATE SEQUENCE - Amazon Aurora DSQL

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 AS data_type especifica el tipo de datos de la secuencia. Los valores válidos son bigint. bigint es 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 BY increment especifica 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.

minvalue / NO MINVALUE

La cláusula opcional MINVALUE minvalue determina el valor mínimo que puede generar una secuencia. Si esta cláusula no se proporciona o se especifica NO 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 MAXVALUE maxvalue determina el valor máximo para la secuencia. Si esta cláusula no se proporciona o se especifica NO 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 CYCLE permite que la secuencia se repita cuando los valores maxvalue o minvalue se han alcanzado mediante una secuencia ascendente o descendente, respectivamente. Si se alcanza el límite, el siguiente número generado será el valor minvalue o maxvalue, respectivamente.

Si NO CYCLE se especifica, cualquier llamada realizada a nextval después de que la secuencia haya alcanzado su valor máximo devolverá un error. Si CYCLE o NO CYCLE no se especifican, NO CYCLE es el valor predeterminado.

iniciar

La cláusula opcional START WITH start permite que la secuencia comience en cualquier lugar. El valor inicial predeterminado es minvalue para las secuencias ascendentes y maxvalue para las descendentes.

cache

La cláusula CACHE cache especifica cuántos números de secuencia se deben preasignar y almacenar en la memoria para un acceso más rápido. Los valores aceptables para CACHE en 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_name / OWNED BY NONE

La opción OWNED BY hace 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 secuencia OWNED 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ón NEXT VALUE FOR del estándar.

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