CREAR SECUENCIA: definir un nuevo generador de secuencia

Sinopsis

CREATE[TEMPORARY|TEMP] SEQUENCE [IFNOTEXISTS] name
    [AS data_type ][ INCREMENT [BY] increment ][ MINVALUE minvalue |NO MINVALUE ][ MAXVALUE maxvalue |NO MAXVALUE ][START[WITH]start][ CACHE cache ][[NO]CYCLE][ OWNED BY  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 name. El generador será propiedad del usuario que emite 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 dar un nombre de esquema al crear una secuencia temporal. El nombre de la secuencia debe ser distinto del nombre de cualquier otra secuencia, tabla, índice, vista o tabla externa en el mismo esquema.

Después de crear una secuencia, usa las funciones nextval, currval, y setval para operar en la secuencia. Estas funciones están documentadas en la Sección 9.17.

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

SELECT*FROM name;

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

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.

IF NOT EXISTS

No arroje 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 se parezca a la secuencia que se habría creado; es posible que ni siquiera sea una secuencia.

name

El nombre (opcionalmente calificado por esquema) de la secuencia que se creará.

data_type

La cláusula opcional AS data_type especifica el tipo de datos de la secuencia. Los tipos válidos son smallint, integer, y bigint. bigint es el predeterminado. El tipo de datos determina los valores mínimo y máximo predeterminados de la secuencia.

increment

La cláusula opcional INCREMENT BY increment especifica qué valor se agrega al valor de secuencia actual para crear un nuevo valor. Un valor positivo hará una secuencia ascendente, uno negativo una secuencia descendente. El valor predeterminado es 1.

minvalueNO 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 NO MINVALUE se especifica, 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.

maxvalueNO MAXVALUE

La cláusula opcional MAXVALUE maxvalue determina el valor máximo de la secuencia. Si esta cláusula no se proporciona o NO MAXVALUE se especifica, 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.

start

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

cache

La cláusula opcional CACHE cache especifica cuántos números de secuencia se preasignarán y almacenarán en la 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 también es el predeterminado.

CYCLENO CYCLE

los CYCLE La opción permite que la secuencia se envuelva cuando la maxvalue o minvalue ha sido alcanzado por una secuencia ascendente o descendente respectivamente. Si se alcanza el límite, el siguiente número generado será el minvalue o maxvalue, respectivamente.

Si NO CYCLE se especifica, cualquier llamada a nextval una vez que la secuencia ha alcanzado su valor máximo, devolverá un error. Si ninguno CYCLE o NO CYCLE están especificados, NO CYCLE es el predeterminado.

OWNED BYtable_name.column_nameOWNED BY NONE

los OWNED BY La opción hace que la secuencia se asocie con una columna de tabla específica, de modo que si se elimina esa columna (o toda la tabla), 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

Usar DROP SEQUENCE para eliminar una secuencia.

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

Porque nextval y setval las llamadas nunca se revierten, los objetos de secuencia no se pueden usar si sin pausas es necesaria la asignación de números de secuencia. Es posible construir una asignación sin espacios utilizando el bloqueo exclusivo de una tabla que contiene un contador; pero esta solución es mucho más cara que los objetos de secuencia, especialmente si muchas transacciones necesitan números de secuencia al mismo tiempo.

Se pueden obtener resultados inesperados si un cache un valor mayor que uno se utiliza para un objeto de secuencia que se utilizará simultáneamente en varias sesiones. Cada sesión asignará y almacenará en caché los valores de secuencia sucesivos durante un acceso al objeto de secuencia y aumentará el valor del objeto de secuencia. last_value respectivamente. Entonces, el siguiente cache-1 usos de nextval dentro de esa sesión, simplemente devuelva los valores preasignados sin tocar el objeto de secuencia. Por lo tanto, los números asignados pero no utilizados dentro de una sesión se perderán cuando esa sesión finalice, lo que resultará en agujeros en la secuencia.

Además, aunque se garantiza que varias sesiones asignan valores de secuencia distintos, los valores pueden generarse fuera de secuencia cuando se consideran todas las sesiones. Por ejemplo, con un cache ajuste de 10, la sesión A puede reservar valores 1..10 y regresar nextval= 1, entonces la sesión B podría reservar los valores 11..20 y regresar nextval= 11 antes de que la sesión A haya generado nextval= 2. Así, con un cache ajuste de uno es seguro asumir que nextval los valores se generan secuencialmente; con un cache ajuste mayor que uno, solo debe asumir que el nextval los valores son todos distintos, no es que se generen de forma puramente secuencial. También, last_value reflejará el último valor reservado por cualquier sesión, ya sea que haya sido devuelto o no por nextval.

Otra consideración es que un setval ejecutadas en una secuencia de este tipo no serán notadas por otras sesiones hasta que hayan agotado los valores preasignados que hayan almacenado en caché.

Ejemplos de

Crea una secuencia ascendente llamada serial, a partir de 101:

CREATE SEQUENCE serialSTART101;

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 una INSERT mando:

INSERTINTO distributors VALUES(nextval('serial'),'nothing');

Actualice 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 mediante el nextval() función en lugar de la estándar NEXT VALUE FOR expresión.

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

Ver también

ALTER SEQUENCE, DROP SEQUENCE

Anterior Hasta próximo
CREAR ESQUEMA Hogar CREAR SERVIDOR