CREATE SEQUENCE

Nome

CREATE SEQUENCE -- cria um gerador de seqüência

Sinopse

CREATE [ TEMPORARY | TEMP ] SEQUENCE nome [ INCREMENT [ BY ] incremento ]
    [ MINVALUE valor_mínimo | NO MINVALUE ] [ MAXVALUE valor_máximo | NO MAXVALUE ]
    [ START [ WITH ] início ] [ CACHE cache ] [ [ NO ] CYCLE ]

Descrição

O comando CREATE SEQUENCE cria um gerador de números seqüenciais, que envolve a criação e a inicialização de uma nova tabela especial com uma única linha chamada nome. O usuário que executa o comando se torna o dono do gerador.

Se um nome de esquema for fornecido, então a seqüência é criada no esquema especificado, senão é criada no esquema corrente. As seqüências temporárias são criadas em um esquema especial e, portanto, o nome do esquema não pode ser fornecido ao se criar uma seqüência temporária. O nome da seqüência deve ser distinto do nome de qualquer outra seqüência, tabela, índice ou visão no mesmo esquema.

Após a seqüência ser criada, podem ser utilizadas as funções nextval, currval e setval para operar na seqüência. Estas funções estão documentadas na Seção 9.11 .

Embora não seja possível atualizar uma seqüência diretamente, pode ser feita uma consulta como

SELECT * FROM nome;

para examinar os parâmetros e o estado atual da seqüência. Em particular, o campo last_value da seqüência mostra o último valor atribuído para qualquer sessão (É claro que este valor pode estar obsoleto no instante em que for exibido, se outras sessões estiverem chamando a função nextval).

Parâmetros

TEMPORARY ou TEMP
Se for especificado, o objeto de seqüência é criado somente para esta sessão, sendo automaticamente removido ao término da sessão. Seqüências permanentes existentes não serão visíveis (na sessão) enquanto existirem seqüências temporárias com o mesmo nome, a não ser que sejam referenciadas por um nome qualificado pelo esquema.
nome
O nome (opcionalmente qualificado pelo esquema) da seqüência a ser criada.
incremento
A cláusula opcional INCREMENT BY incremento especifica o valor a ser adicionado ao valor corrente da seqüência para gerar o novo valor. Um valor positivo cria uma seqüência ascendente, enquanto um valor negativo cria uma seqüência descendente. O valor padrão é 1.
valor_mínimo
NO MINVALUE
A cláusula opcional MINVALUE valor_mínimo determina o valor mínimo que a seqüência pode gerar. Se esta cláusula não for fornecida, e se NO MINVALUE não for especificado, então são utilizados os valores padrão. Os valores padrão são 1 e -263-1 para seqüências ascendentes e descendentes, respectivamente.
valor_máximo
NO MAXVALUE
A cláusula opcional MAXVALUE valor_máximo determina o valor máximo que a seqüência pode gerar. Se esta cláusula não for fornecida, e se NO MAXVALUE não for especificado, então são utilizados os valores padrão. Os valores padrão são 263-1 e -1 para seqüências ascendentes e descendentes, respectivamente.
início
A cláusula opcional START WITH início permite a seqüência iniciar com qualquer valor. O valor inicial padrão é o valor_mínimo para seqüências ascendentes, e o valor_máximo para seqüências descendentes.
cache
A cláusula opcional CACHE cache especifica quantos números da seqüência são previamente reservados e armazenados em memória para acesso mais rápido. O valor mínimo é 1 (somente um valor é gerado de cada vez, ou seja, sem cache), e este também é o valor padrão.
CYCLE
NO CYCLE
A opção CYCLE permite uma seqüência reiniciar quando atingir o valor_máximo ou o valor_mínimo, respectivamente. Se o limite for atingido, o próximo número gerado será o valor_mínimo ou o valor_máximo, respectivamente. Se NO CYCLE for especificado, toda chamada a nextval após a seqüência ter atingido seu valor máximo retorna um erro. Se nem CYCLE nem NO CYCLE for especificado, NO CYCLE é o padrão.

Observações

Use o comando DROP SEQUENCE para remover uma seqüência.

As seqüências são baseadas na aritmética do tipo bigint e, portanto, a faixa de valores não pode exceder a faixa de um número inteiro de 8 bytes (-9223372036854775808 a 9223372036854775807). Em algumas plataformas mais antigas, pode não haver suporte do compilador para números inteiros de 8 bytes e, neste caso, as seqüências utilizam a aritmética do tipo integer regular (faixa de valores de -2147483648 a +2147483647).

Se for utilizada uma definição de cache maior que um, para um objeto de seqüência que será usado concorrentemente por várias sessões, podem ser obtidos resultados não esperados. Cada sessão reserva e armazena valores sucessivos da seqüência durante um acesso ao objeto de seqüência, e aumenta o valor de last_value do objeto de seqüência da forma apropriada. Então, as próximas cache-1 utilizações de nextval nesta sessão simplesmente retornam os valores reservados sem acessar o objeto de seqüência. Portanto, todos os números alocados, mas não utilizados pela sessão, são perdidos quando a sessão termina, produzindo "buracos" na seqüência.

Além disso, embora se garanta que as várias sessões reservam valores distintos da seqüência, os valores podem ser gerados fora de seqüência quando são levadas em consideração todas as sessões. Por exemplo, definindo-se cache igual a 10, a sessão A pode reservar os valores 1..10 e retornar nextval=1, enquanto a sessão B pode reservar os valores 11..20 e retornar nextval=11 antes da sessão A ter gerado nextval=2. Portanto, com uma definição de cache igual a um é seguro assumir que os valores de nextval são gerados seqüencialmente; com uma definição de cache maior do que um apenas pode-se assumir que os valores de nextval são todos distintos, mas não que sejam gerados de forma inteiramente seqüencial. Também, o valor last_value reflete o último valor reservado por qualquer sessão, tenha ou não sido retornado por nextval.

Outra consideração a ser feita é que a execução de setval neste tipo de seqüência não será percebida pelas outras sessões enquanto estas não utilizarem todos os valores reservados guardados no cache.

Exemplos

Criar uma seqüência ascendente chamada serial, começando por 101:

CREATE SEQUENCE serial START 101;

Selecionar o próximo valor desta seqüência:

SELECT nextval('serial');
    
 nextval
---------
     114

Utilizar esta seqüência no comando INSERT: [1]

INSERT INTO distribuidores VALUES (nextval('serial'), 'nada');

Atualizar o valor da seqüência após executar o comando COPY FROM:

BEGIN;
COPY distribuidores FROM 'arquivo_de_entrada';
SELECT setval('serial', max(id)) FROM distribuidores;
END;

Compatibilidade

O comando CREATE SEQUENCE é uma extensão do PostgreSQL à linguagem. Não existe o comando CREATE SEQUENCE no padrão SQL.

Notas

[1]

Oracle — No Oracle 9i nextval e currval são pseudocolunas e não funções, portanto é usado no comando INSERT, por exemplo, INSERT INTO orders VALUES (orders_seq.nextval, ... e INSERT INTO order_items VALUES (orders_seq.currval, ... Oracle9i SQL Reference - Release 2 (9.2) - Part Number A96540-02 (N. do T.)

SourceForge.net Logo