CREATE SEQUENCE seqname [ INCREMENT increment ] [ MINVALUE minvalue ] [ MAXVALUE maxvalue ] [ START start ] [ CACHE cache ] [ CYCLE ] |
El nombre de una secuencia que sera creada.
La clausula INCREMENT increment es opcional. Un valor positivo hara una secuencia ascendente, uno negativo hara una secuencia descendente. El valor por omision es uno (1).
La clausula opcional MINVALUE minvalue determina el valor minimo que una secuencia puede generar. El valor por omision es 1 y -2147483647 para secuencias ascendentes y descendentes, respectivamente.
Utilice la clausula opcional MAXVALUE maxvalue para determinar el valor maximo para una secuencia. Por omision son 2147483647 y -1 para secuencias ascendentes y descendentes, respectivamente.
La clausula opcional START start habilita la secuencia para que comience en cualquier lugar. El valor de inicio por omision es minvalue para secuencias ascendentes y maxvalue para las descendentes.
La opcion CACHE cache permite que los numeros de la secuencia sean alojados (preallocated) y almacenados en memoria para un acceso mas rapido. El valor minimo es 1 (solo se puede generar un valor cada vez, i.e. sin cache) y es tambien el valor por omision.
La palabra clave (keyword) CYCLE puede ser utulizada para permitir a la secuencia continuar cuando el valor de maxvalue o el de minvalue ha sido alcanzado por una secuencia ascendente o descendente respectivamente. Si el limite es alcanzado, el siguiente numero generado sera cualquiera que para minvalue o maxvalue sea tomado como apropiado.
Mensaje devuelto si el comando es ejecutado con exito.
Si la secuencia especificada ya existe.
Si el valor de inicio especificado esta fuera de rango.
Si el valor de inicio especificado esta fuera de rango.
Si el valor minimo y maximo son inconsistentes.
CREATE SEQUENCE introducira una nueva secuencia generadora de numeros dentro de la actual base de datos. Esto implica la creacion e inicializacion de una nueva tabla de una linea con el nombre seqname. La secuencia generadora sera propiedad del usuario que ejecuta el comando.
Depsues de que se crea una secuencia, puede utilizar la funcion nextval(seqname) par aobtener una nuevo numero de la secuencia. La funcion currval('seqname') puede ser utilizada para determinar el numerp devuelto por la ultima llamada a nextval(seqname) desde la secuencia especificada en la sesion en curso. La funcion setval('seqname', newvalue) puede ser utilizada para configurar el valor actual de la secuencia especificada. La siguiente llamada a nextval(seqname) devolvera el valor dado mas la secuencia de incremento.
Utilice una consulta (query) como
SELECT * FROM sequence_name; |
SELECT last_value FROM sequence_name; |
Se utliza bajo nivel de bloque para habilitar multiples llamadas simultaneas a un generador.
Se pueden obtener resultados inesperados si una configuracion de cache mayor que uno es utilizada por un objeto secuencia que sera usado concurrentemente por multiples procesos en el servidor (backends). Cada proceso en el servidor (backend)asignara valores de secuencia "cache" succesivas durante un acceso al objeto secuencia e incrementara el ultimo valor (last_value) del objeto secuencia en conformidad con esto. De este modo, el siguiente uso de cache-1 de nextval dentro de ese proceso en el servidor (backend) devolvera simplemente los valores asignados sin tocar el objeto compartido. Asi pues, los numeros asignados pero no utilizados en la sesion en curso se perderan. Mas aun, aunque se garantice por multiples procesos en el servidor (backends) la asignacion de distintos valores de secuencia, los valores pueden ser generados fuera de secuencia cuando los procesos en el servidor (backends) son tenidos en cuenta. (Por ejemplo, con una configuracion de cache de 10, el proceso A puede reservar valores 1..10 y devolver un nextval=1, entonces el proceso B puede reservar valores 11..20 y devolver un nextval=11 antes de que el proceso A ha generado un nextval=2.) Asi, con una configuracion de cache de uno es seguro asumir que los valores de nextval seran generados secuencialmente; conuna cache configurada mayor que uno solo podrias asumir que los valores de nextvalue seran todos distintos, no que seran todos generados de un modo puramente secuencial. Tambien, last_value reflejara el ultimo valor reservado por cualquier proceso en el servidor (backend), tanto si ya ha sido devuelto por nextval como si no. |
Remitase a estado DROP SEQUENCE para eliminar una secuencia.
Cada proceso en el servidor (backend) utiliza su propia cache para almacenar numeros asignados. Los numeros que estan en la cache pero no son utilizado en la sesion en curso se perderan, dando como resultado "vacios" en la secuencia.
Crea una secuencia ascendente llamada serial, comenzando en 101:
CREATE SEQUENCE serial START 101; |
Seleccione el siguiente numero de esta secuencia
SELECT NEXTVAL ('serial'); nextval ------- 114 |
Utilice esta secuencia en una INSERT:
INSERT INTO distributors VALUES (NEXTVAL('serial'),'nothing'); |
Configurar el valor de la secuencia despues de un COPY FROM:
CREATE FUNCTION distributors_id_max() RETURNS INT4 AS 'SELECT max(id) FROM distributors' LANGUAGE 'sql'; BEGIN; COPY distributors FROM 'input_file'; SELECT setval('serial', distributors_id_max()); END; |