Esta seção descreve as funções do PostgreSQL que operam com objetos de seqüência. Os objetos de seqüência (também chamados de geradores de seqüência ou simplesmente de seqüências), são tabelas especiais de um única linha criadas pelo comando CREATE SEQUENCE. Um objeto de seqüência normalmente é usado para gerar identificadores únicos para linhas de uma tabela. As funções de seqüência, listadas na Tabela 6-26, fornecem métodos simples, seguros para multiusuários, para obter valores sucessivos da seqüência a partir dos objetos de seqüência.
Tabela 6-26. Funções de seqüências
Função | Retorna | Descrição |
---|---|---|
nextval (text) | bigint | Avança a seqüência e retorna o novo valor |
currval (text) | bigint | Retorna o valor mais recentemente obtido pelo nextval |
setval (text,bigint) | bigint | Estabelece o valor corrente da seqüência |
setval (text,bigint,boolean) | bigint | Estabelece o valor corrente da seqüência e sinaliza is_called |
Por motivos históricos, a seqüência a ser operada pela chamada da função de seqüência é especificada por um argumento que é um texto em uma cadeia de caracteres. Para obter alguma compatibilidade com o tratamento usual dos nomes no SQL, a função de seqüência converte as letras do argumento em minúsculas, a não ser que a cadeia de caracteres esteja entre aspas. Portanto
nextval('foo') opera na seqüência foo nextval('FOO') opera na seqüência foo nextval('"Foo"') opera na seqüência Foo
Havendo necessidade, o nome da seqüência pode ser qualificado pelo esquema:
nextval('meu_esquema.foo') opera em meu_esquema.foo nextval('"meu_esquema".foo') o mesmo acima nextval('foo') percorre o caminho de procura buscando foo
É claro que o texto do argumento pode ser o resultado de uma expressão, e não somente um literal simples, o que algumas vezes é útil.
As funções de seqüência disponíveis são:
nextval
Avança o objeto de seqüência para seu próximo valor e retorna este
valor. Isto é feito atomicamente: mesmo que várias sessões executem
nextval
concorrentemente, cada uma recebe um valor
distinto da seqüência com segurança.
currval
Retorna o valor obtido mais recentemente por nextval
para esta seqüência na sessão corrente (Ocasiona erro
se nextval
nunca tiver sido chamado para esta
seqüência nesta sessão). Como é retornado o valor
da sessão, uma resposta previsível é fornecida mesmo que outras
sessões também estejam executando nextval
.
setval
Redefine o valor do contador do objeto de seqüência. A forma com dois parâmetros
define o campo last_value (último valor) da seqüência com o valor
especificado, e define o campo is_called como true,
indicando que o próximo nextval
avançará a seqüência
antes de retornar o valor. Na forma com três parâmetros,
is_called pode ser definido tanto como true
quanto como false. Se for definido como false,
o próximo nextval
retornará o próprio valor especificado,
e o avanço da seqüência somente começará no
nextval
seguinte. Por exemplo,
SELECT setval('foo', 42); o próximonextval()
retorna 43 SELECT setval('foo', 42, true); o mesmo acima SELECT setval('foo', 42, false); o próximonextval()
retorna 42
O resultado retornado por setval
é simplesmente o valor
de seu segundo argumento.
Importante: Para evitar bloquear transações concorrentes ao obter valores de uma mesma seqüência, a operação
nextval
nunca é desfeita (rolled back); ou seja, após o valor ser obtido este passa a ser considerado como tendo sido usado, mesmo que depois a transação que executou onextval
aborte. Isto significa que as transações abortadas podem deixar "buracos" não utilizados na seqüência de valores atribuídos. Além disso, as operaçõessetval
nunca são desfeitas.
Se o objeto de seqüência tiver sido criado com os parâmetros padrão,
as chamadas à nextval()
retornam valores sucessivos
começando por um. Outros comportamentos podem ser obtidos utilizando
parâmetros especiais no comando CREATE SEQUENCE;
veja a página de referência deste comando para obter mais informações.