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 ]
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
).
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.
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.
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;
O comando CREATE SEQUENCE é uma extensão do PostgreSQL à linguagem. Não existe o comando CREATE SEQUENCE no padrão SQL.
[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.) |