CREATE SEQUENCE — define um novo gerador de sequência
CREATE [ { TEMPORARY | TEMP } | UNLOGGED ] SEQUENCE [ IF NOT EXISTS ] nome_da_sequência
[ AS tipo_de_dados ]
[ INCREMENT [ BY ] incremento ]
[ MINVALUE valor_mínimo | NO MINVALUE ]
[ MAXVALUE valor_máximo | NO MAXVALUE ]
[ [ NO ] CYCLE ]
[ START [ WITH ] início ]
[ CACHE cache ]
[ OWNED BY { nome_da_tabela.nome_da_coluna | NONE } ]
O comando CREATE SEQUENCE define um novo gerador
de sequência de números.
Isto envolve criar e inicializar uma nova tabela especial de uma
única linha com o nome
nome_da_sequência.
O usuário que executa o comando se torna o dono da sequência.
Se for fornecido o nome do esquema, a sequência será criada no esquema especificado. Caso contrário, será criada no esquema corrente. As sequências temporárias existem em um esquema especial, portanto, não pode ser fornecido o nome do esquema ao criar uma sequência temporária. O nome da sequência deve ser diferente do nome de qualquer outra relação (tabela, sequência, índice, visão, visão materializada ou tabela estrangeira) no mesmo esquema.
Após a sequência ser criada, podem ser usadas as funções
nextval,
currval, e
setval para operar na sequência.
Estas funções estão documentadas na
Funções para manusear sequência.
Embora não se possa atualizar uma sequência diretamente, pode ser usada uma consulta como
SELECT * FROM nome_da_sequência;
para examinar os parâmetros e o estado corrente da sequência.
Em particular, o campo last_value da sequência
mostra o último valor alocado por qualquer sessão.
(Obviamente, este valor pode estar obsoleto no momento em que for
visto, caso outras sessões estejam fazendo chamadas à função
nextval ativamente.)
TEMPORARY ou TEMPSe especificado, o gerador de sequência é criado apenas para esta sessão, sendo descartado automaticamente ao fim da sessão. As sequências permanentes existentes com o mesmo nome não estarão visíveis (nesta sessão) enquanto a sequência temporária existir, a menos que sejam referenciadas com nomes qualificados pelo esquema.
UNLOGGEDSe especificado, a sequência será criada como uma sequência sem registro. As alterações em sequências sem registro não são escritas no registro de transações (WAL/write-ahead log). Elas não são seguras em caso de falhas: uma sequência sem registro é automaticamente redefinida para seu estado inicial após uma falha ou desligamento incorreto. Sequências sem registro também não são replicadas para servidores em espera (standby).
Ao contrário das tabelas sem registro, as sequências sem registro não oferecem uma vantagem de desempenho significativa. Esta opção destina-se principalmente a sequências associadas a tabelas sem registro por meio de colunas de identidade ou colunas seriais. Nesses casos, geralmente não faria sentido ter a sequência registrada no WAL e replicada, mas não a tabela associada.
IF NOT EXISTSNão relata erro se já existir uma relação com o mesmo nome. É emitido um aviso neste caso. Note não haver garantia de que a relação existente seja parecida com a sequência a ser criada — pode até nem ser uma sequência.
nome_da_sequênciaO nome (opcionalmente qualificado pelo esquema) da sequência a ser criada.
tipo_de_dados
A cláusula opcional
AS
especifica o tipo de dados da sequência.
Os tipos de dados válidos são tipo_de_dadossmallint,
integer, e bigint, sendo que
bigint é o padrão.
O tipo de dados determina os valores mínimo e máximo padrão da
sequência.
incremento
A cláusula opcional
INCREMENT BY
especifica o valor a ser adicionado ao valor corrente da sequência
para criar o novo valor.
Um valor positivo cria uma sequência ascendente, e um valor
negativo cria uma sequência descendente.
O valor padrão é 1.
incremento
valor_mínimoNO MINVALUE
A cláusula opcional
MINVALUE
determina o valor mínimo que a sequência pode gerar.
Se esta cláusula não for fornecida, ou for especificado
valor_mínimoNO MINVALUE, será usado o valor padrão.
O valor padrão para uma sequência ascendente é 1.
O valor padrão para uma sequência descendente é o valor mínimo
do tipo de dados.
valor_máximoNO MAXVALUE
A cláusula opcional
MAXVALUE
determina o valor máximo para a sequência.
Se esta cláusula não for fornecida, ou for especificado
valor_máximoNO MAXVALUE, será usado o valor padrão.
O valor padrão para uma sequência ascendente é o valor máximo
do tipo de dados.
O valor padrão para uma sequência descendente é -1.
CYCLENO CYCLE
A opção CYCLE permite que a sequência recomece
quando o
valor_máximo ou o
valor_mínimo
for alcançado por uma sequência ascendente ou descendente,
respectivamente.
Se o limite for atingido, o próximo número gerado será o
valor_mínimo ou o
valor_máximo,
respectivamente.
Se for especificado NO CYCLE, qualquer chamada
à função nextval após a sequência atingir
seu valor limite, será retornado um erro.
Quando nem CYCLE nem NO CYCLE
for especificado, o padrão será NO CYCLE.
início
A cláusula opcional
START WITH
permite que a sequência comece com qualquer valor.
O valor inicial padrão é o
iníciovalor_mínimo para as
sequências ascendentes, e o
valor_máximo para as
sequências descendentes.
cache
A cláusula opcional
CACHE
especifica quantos números da sequência devem ser pré-alocados
e armazenados na memória para acesso mais rápido.
O valor mínimo é 1 (somente um valor pode ser gerado por vez,
ou seja, sem cache), e este também é o valor padrão.
cache
OWNED BY nome_da_tabela.nome_da_colunaOWNED BY NONE
A opção OWNED BY faz com que a sequência seja
associada a uma coluna específica da tabela, de modo que, se esta
coluna (ou toda a tabela) for excluída, a sequência também será
automaticamente excluída.
A tabela especificada deve ter o mesmo dono, e estar no mesmo
esquema da sequência.
A opção OWNED BY NONE, é o padrão,
especificando não existir esta associação.
O comando DROP SEQUENCE remove a sequência.
As sequências são baseadas na aritmética do tipo de dados
bigint, portanto, o intervalo não pode exceder o
intervalo de um número inteiro de oito bytes
(-9223372036854775808 a 9223372036854775807).
Como as chamadas às funções nextval e
setval nunca são desfeitas, os objetos de
sequência não podem ser usados se for necessária uma atribuição
“sem buracos” de números sequenciais.
É possível construir atribuições “sem buracos” usando
bloqueio exclusivo de uma tabela contendo o contador; mas esta
solução tem um custo maior do que os geradores de sequência,
especialmente se muitas transações precisarem de números de sequência
simultaneamente.
Podem acontecer resultados não esperados se for usada uma configuração
de cache maior que um,
para um gerador de sequência que será usado simultaneamente por
várias sessões.
Cada sessão irá alocar e armazenar em cache valores sucessivos de
sequência durante o acesso ao gerador de sequência, e aumentar o
último valor (campo last_value) do gerador de
sequência de acordo.
Então, os próximos
cache-1 usos de
nextval dentro dessa sessão simplesmente
retornam os valores pré-alocados sem tocar no gerador de sequência.
Portanto, quaisquer números alocados, mas não utilizados em uma sessão,
serão perdidos quando esta sessão terminar, resultando em
“buracos” na sequência.
Além disso, embora seja garantido que várias sessões obtenham valores
de sequência distintos, os valores podem ser gerados fora de
sequência quando todas as sessões são consideradas.
Por exemplo, com uma configuração de
cache igual a 10,
a sessão A pode reservar valores de 1 a 10 e retornar
nextval=1,
então a sessão B pode reservar os valores de 11 a 20 e retornar
nextval=11 antes que a sessão A tenha gerado
nextval=2.
Portanto, com uma configuração de
cache igual a um,
é seguro assumir que os valores de nextval sejam
gerados sequencialmente; com uma configuração de
cache maior que um,
deve-se assumir apenas que os valores de nextval
são todos distintos, e não que sejam gerados puramente sequencialmente.
Além disso, o campo last_value irá refletir o
valor mais recente reservado por qualquer sessão, tenha ou não sido
retornado por nextval.
Outra consideração é que setval executado nesta
sequência não será notado pelas outras sessões, até que tenham usado
todos os valores pré-alocados armazenados em cache.
Criar uma sequência ascendente chamada serial,
começando em 101:
CREATE SEQUENCE serial START 101;
Obter o próximo número dessa sequência:
SELECT nextval('serial');
nextval
---------
101
Obter novamente o próximo número dessa sequência:
SELECT nextval('serial');
nextval
---------
102
Usar esta sequência em um comando INSERT:
INSERT INTO distributors VALUES (nextval('serial'), 'nothing');
Atualizar o valor da sequência após o comando
COPY FROM:
BEGIN;
COPY distributors FROM 'input_file';
SELECT setval('serial', max(id)) FROM distributors;
END;
Exemplo 83. Exemplo do tradutor
Sequência de valores zero e um
Neste exemplo é criada uma sequência temporária que retorna valores zero e um alteradamente.
CREATE TEMPORARY SEQUENCE zero_um
INCREMENT BY 1
MINVALUE 0
MAXVALUE 1
START WITH 0
CYCLE
CACHE 1;
CREATE SEQUENCE
SELECT nextval('zero_um'), nextval('zero_um'), nextval('zero_um');
nextval | nextval | nextval
---------+---------+---------
0 | 1 | 0
(1 linha)
SELECT nextval('zero_um'), nextval('zero_um'), nextval('zero_um');
nextval | nextval | nextval
---------+---------+---------
1 | 0 | 1
(1 linha)
O comando CREATE SEQUENCE está em conformidade
com o padrão SQL, com as seguintes exceções:
A obtenção do próximo valor é feita usando a função
nextval(), em vez da expressão
NEXT VALUE FOR do padrão.
A cláusula OWNED BY é uma extensão do
PostgreSQL.
As informações sobre cada sequência no banco de dados podem ser consultadas através da visão do sistema pg_sequences.