Esta seção descreve as funções que operam em objetos de sequência, também chamados de geradores de sequência, ou apenas sequências. Os objetos de sequência são tabelas especiais de uma única linha criadas por CREATE SEQUENCE. Os objetos de sequência são comumente usados para gerar identificadores únicos para as linhas de uma tabela. As funções de sequência, listadas na Tabela 9.55, fornecem métodos multiusuários simples e seguros para obter valores de sequência sucessivos de objetos de sequência.
Tabela 9.55. Funções de sequência
Função Descrição |
|---|
|
Avança o objeto de sequência para seu próximo valor e retorna
esse valor.
Isto é feito atomicamente: mesmo que várias sessões executem
Esta função requer o privilégio |
Define o valor corrente do objeto de sequência e, opcionalmente,
seu sinalizador
SELECT setval('myseq', 42); Retorna 42. O próximo
O resultado retornado por
Esta função requer o privilégio |
|
Retorna o valor obtido mais recentemente por
Esta função requer o privilégio |
|
Retorna o valor retornado mais recentemente por
Esta função requer o privilégio |
Para evitar o bloqueio de transações concorrentes, que obtêm números
da mesma sequência, o valor obtido pela função
nextval não é recuperado para ser usado
novamente se a transação que chamou a função for desfeita
posteriormente, significando que o término anormal de transações,
ou falhas no banco de dados, podem resultar em descontinuidades na
sequência dos valores atribuídos.
Também pode ocorrer sem que aconteça o término anormal da transação.
Por exemplo, um INSERT com a cláusula
ON CONFLICT irá computar a tupla a ser inserida,
incluindo fazer qualquer chamada a nextval
necessária, antes de detectar qualquer conflito que faria com que
seguisse a regra ON CONFLICT. Portanto, os
objetos de sequência do PostgreSQL
não podem ser usados para obter sequências
“sem descontinuidades”.
Da mesma forma, as alterações no estado da sequência feitas por
setval são imediatamente visíveis pelas outras
transações, e não são desfeitas se a transação que chamou a função
for desfeita (roll back).
Se o agrupamento (cluster) de bancos
de dados tiver problemas antes de efetivar uma transação contendo
uma chamada à função nextval ou
setval, a alteração de estado da sequência pode
não ter chegado ao armazenamento persistente, de modo que é incerto
se a sequência terá seu estado original ou atualizado após a
reinicialização do agrupamento.
Isto é inócuo para o uso da sequência dentro do banco de dados,
porque outros efeitos de transações não confirmadas também não
serão visíveis.
No entanto, se for desejado usar um valor de sequência para
propósitos persistentes fora do banco de dados, certifique-se de
que a chamada à função nextval tenha sido
efetivada antes de fazer isto.
A sequência a ser operada por uma função de sequência é especificada
por um argumento do tipo de dados regclass, que é apenas
o OID da sequência no catálogo do sistema
pg_class.
No entanto, não é necessário procurar o OID manualmente, porque
o conversor de entrada do tipo de dados regclass faz
esse trabalho.
Veja a Seção 8.19 para obter detalhes.