CREATE SEQUENCE

CREATE SEQUENCE — define um novo gerador de sequência

Sinopse

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 } ]

Descrição

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.)

Parâmetros

TEMPORARY ou TEMP

Se 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.

UNLOGGED

Se 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 EXISTS

Nã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ência

O nome (opcionalmente qualificado pelo esquema) da sequência a ser criada.

tipo_de_dados

A cláusula opcional AS tipo_de_dados especifica o tipo de dados da sequência. Os tipos de dados válidos são smallint, 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 incremento 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.

valor_mínimo
NO MINVALUE

A cláusula opcional MINVALUE valor_mínimo determina o valor mínimo que a sequência pode gerar. Se esta cláusula não for fornecida, ou for especificado NO 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áximo
NO MAXVALUE

A cláusula opcional MAXVALUE valor_máximo determina o valor máximo para a sequência. Se esta cláusula não for fornecida, ou for especificado NO 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.

CYCLE
NO 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 início permite que a sequência comece com qualquer valor. O valor inicial padrão é o valor_mínimo para as sequências ascendentes, e o valor_máximo para as sequências descendentes.

cache

A cláusula opcional CACHE 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.

OWNED BY nome_da_tabela.nome_da_coluna
OWNED 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.

Notas

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.

Exemplos

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)

Conformidade

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.

Consulta

As informações sobre cada sequência no banco de dados podem ser consultadas através da visão do sistema pg_sequences.

Veja também

ALTER SEQUENCE, DROP SEQUENCE