CREATE SEQUENCE

Nombre

CREATE SEQUENCE  --  Crea una nueva secuencia de generador de numeros

Synopsis

CREATE SEQUENCE seqname [ INCREMENT increment ]
    [ MINVALUE minvalue ] [ MAXVALUE maxvalue ]
    [ START start ] [ CACHE cache ] [ CYCLE ]
  

Entradas

seqname

El nombre de una secuencia que sera creada.

increment

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

minvalue

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.

maxvalue

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.

start

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.

cache

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.

CYCLE

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.

Outputs

CREATE

Mensaje devuelto si el comando es ejecutado con exito.

ERROR: Relation 'seqname' already exists

Si la secuencia especificada ya existe.

ERROR: DefineSequence: MINVALUE (start) can't be >= MAXVALUE (max)

Si el valor de inicio especificado esta fuera de rango.

ERROR: DefineSequence: START value (start) can't be < MINVALUE (min)

Si el valor de inicio especificado esta fuera de rango.

ERROR: DefineSequence: MINVALUE (min) can't be >= MAXVALUE (max)

Si el valor minimo y maximo son inconsistentes.

Descripcion

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;
   
para obtener los parametros de una secuencia. Aparte de obtener los parametros originales, puede utilizar
SELECT last_value FROM sequence_name;
   
para obtener el ultimo valor asignado por cualquier proceso en el servidor (backend). to obtain the last value allocated by any backend. parametros que puedes utilizar

Se utliza bajo nivel de bloque para habilitar multiples llamadas simultaneas a un generador.

Atención

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.

Notas

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.

Uso

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;
   

Compatibilidad

SQL92

CREATE SEQUENCE es una extension de lenguaje Postgres. No hay estado CREATE SEQUENCE en SQL92.