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
oTEMP
-
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 sonsmallint
,integer
, ybigint
.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. 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 oNO 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. maxvalue
NO MAXVALUE
-
La cláusula opcional
MAXVALUE maxvalue
determina el valor máximo de la secuencia. Si esta cláusula no se proporciona oNO 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 esminvalue
para secuencias ascendentes ymaxvalue
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. CYCLE
NO CYCLE
-
los
CYCLE
La opción permite que la secuencia se envuelva cuando lamaxvalue
ominvalue
ha sido alcanzado por una secuencia ascendente o descendente respectivamente. Si se alcanza el límite, el siguiente número generado será elminvalue
omaxvalue
, respectivamente.Si
NO CYCLE
se especifica, cualquier llamada anextval
una vez que la secuencia ha alcanzado su valor máximo, devolverá un error. Si ningunoCYCLE
oNO CYCLE
están especificados,NO CYCLE
es el predeterminado. OWNED BY
table_name
.column_name
OWNED 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ándarNEXT 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 |
Recuerda que puedes permitirte aclarar si te fue útil.