

# `CREATE SEQUENCE`
<a name="create-sequence-syntax-support"></a>

`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](sequences-identity-columns-working-with.md).

## Sintaxis admitida
<a name="create-sequence-supported-syntax"></a>

```
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
<a name="create-sequence-description"></a>

`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](sequence-functions-syntax-support.md).

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
<a name="create-sequence-parameters"></a>

**`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\$1type***  
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
<a name="create-sequence-notes"></a>

Use [`DROP SEQUENCE`](drop-sequence-syntax-support.md) 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
<a name="create-sequence-examples"></a>

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
<a name="create-sequence-compatibility"></a>

`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.