CREATE SEQUENCE - Amazon Aurora DSQL

CREATE SEQUENCE

CREATE SEQUENCE: define um novo gerador de sequência.

Importante

No PostgreSQL, a especificação do CACHE é opcional e o padrão é 1. Em um sistema distribuído como o Amazon Aurora DSQL, as operações de sequência envolvem coordenação, e o tamanho de cache de 1 pode aumentar os custos indiretos de coordenação quando há alta simultaneidade. Embora valores de cache mais altos permitam atender a números de sequência a partir de intervalos pré-alocados localmente, o que melhora o throughput, valores reservados não utilizados podem ser perdidos, o que torna as lacunas e os efeitos de ordenação mais visíveis. Como as aplicações diferem com relação à susceptibilidade à ordenação de alocação em contraposição ao throughput, o Amazon Aurora DSQL exige que o CACHE seja especificado explicitamente e no momento permite o uso de CACHE = 1 ou CACHE >= 65536, oferecendo uma distinção clara entre o comportamento de alocação mais próximo da geração estritamente sequencial e a alocação otimizada para workloads altamente simultâneas.

Quando o CACHE >= 65536, os valores de sequência permanecerão garantidamente exclusivos, mas existe a possibilidade de que não sejam gerados em uma ordem crescente estrita entre as sessões e de que haja lacunas, principalmente quando os valores armazenados em cache não são totalmente consumidos. Essas características são consistentes com a semântica do PostgreSQL para sequências armazenadas em cache sob uso simultâneo, caso em que ambos os sistemas garantem valores distintos, mas não uma ordenação estritamente sequencial entre as sessões.

Em uma única sessão de cliente, os valores de sequência nem sempre podem parecer estritamente crescentes, especialmente fora das transações explícitas. Esse comportamento é semelhante a implantações do PostgreSQL que usam agrupamento de conexões. O comportamento de alocação mais próximo de um ambiente PostgreSQL de sessão única pode ser obtido usando CACHE = 1 ou obtendo valores de sequência em transações explícitas.

Com o CACHE = 1, a alocação de sequência segue o comportamento de sequência não armazenada em cache do PostgreSQL.

Para obter orientações sobre a melhor forma de usar sequências com base nos padrões de workload, consulte Trabalhar com sequências e colunas de identidade.

Sintaxe compatível

CREATE SEQUENCE [ IF NOT EXISTS ] name CACHE cache [ AS data_type ] [ INCREMENT [ BY ] increment ] [ MINVALUE minvalue | NO MINVALUE ] [ MAXVALUE maxvalue | NO MAXVALUE ] [ [ NO ] CYCLE ] [ START [ WITH ] start ] [ OWNED BY { table_name.column_name | NONE } ] where data_type is BIGINT and cache = 1 or cache >= 65536

Descrição

CREATE SEQUENCE cria um gerador de números de sequência. Isso requer a criação e inicialização de uma nova tabela especial de linha única com name. O gerador pertencerá ao usuário que está emitindo o comando.

Se um nome de esquema for fornecido, a visualização será criada no esquema especificado. Do contrário, a visualização será criada no esquema atual. O nome da sequência deve ser diferente do nome de qualquer outra relação (tabela, sequência, índice, visualização, visão materializada ou tabela estrangeira) no mesmo esquema.

Depois de criar uma sequência, use as funções nextval, currval e setval para operar nela. Essas funções estão documentadas em Funções de manipulação de sequências.

Embora seja possível atualizar uma sequência diretamente, você pode usar uma consulta como:

SELECT * FROM name;

para examinar alguns dos parâmetros e o estado atual de uma sequência. O campo last_value da sequência, especialmente, mostra o último valor alocado por qualquer sessão. (Obviamente, esse valor pode estar obsoleto no momento em que for impresso, se outras sessões estiverem fazendo chamadas nextval ativamente.) Outros parâmetros, como increment e maxvalue, podem ser observados na visualização pg_sequences.

Parâmetros

IF NOT EXISTS

Não gera um erro se já houver uma relação com o mesmo nome. Um aviso é emitido nesse caso. Observe que não há garantia de que a relação existente seja semelhante à sequência que teria sido criada e que ela pode até mesmo não ser uma sequência.

name

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

data_type

A cláusula opcional AS data_type especifica o tipo de dados da sequência. O tipos válidos são bigint. bigint é o padrão. O tipo de dados determina os valores mínimo e máximo padrão da sequência.

increment

A cláusula opcional INCREMENT BY increment especifica qual valor é adicionado ao valor da sequência atual para criar outro valor. Um valor positivo criará uma sequência crescente; um valor negativo criará uma sequência decrescente. O valor padrão é 1.

minvalue / NO MINVALUE

A cláusula opcional MINVALUE minvalue determina o valor mínimo que uma sequência pode gerar. Se essa cláusula não for fornecida ou NO MINVALUE for especificada, serão usados os padrões. O padrão para uma sequência crescente é 1. O padrão para uma sequência decrescente é o valor mínimo do tipo de dados.

maxvalue / NO MAXVALUE

A cláusula opcional MAXVALUE maxvalue determina o valor máximo da sequência. Se essa cláusula não for fornecida ou NO MAXVALUE for especificada, serão usados os padrões. O padrão para uma sequência crescente é o valor máximo do tipo de dados. O padrão para uma sequência decrescente é -1.

CYCLE / NO CYCLE

A opção CYCLE permite que a sequência seja contornada quando o maxvalue ou minvalue for atingido por uma sequência crescente ou decrescente, respectivamente. Se o limite for atingido, o próximo número gerado será o minvalue ou maxvalue, respectivamente.

Se NO CYCLE for especificada, qualquer chamada para nextval depois que a sequência atingir o valor máximo exibirá um erro. Se tanto CYCLE quanto NO CYCLE não forem especificados, o padrão será NO CYCLE.

start

A cláusula opcional START WITH start permite que a sequência comece em qualquer lugar. O valor inicial padrão é minvalue para sequências crescentes e maxvalue para sequências decrescentes.

cache

A cláusula CACHE cache especifica quantos números de sequência devem ser pré-alocados e armazenados na memória para que o acesso seja mais rápido. O valor aceitável para CACHE no Aurora DSQL é 1 ou qualquer número >= 65.536. O valor mínimo é 1 (somente um valor pode ser gerado por vez, o que significa que não há cache).

OWNED BY table_name.column_name / OWNED BY NONE

A opção OWNED BY faz com que a sequência seja associada a uma coluna específica da tabela, de forma que, se essa coluna (ou a tabela inteira) for eliminada, a sequência também será automaticamente eliminada. A tabela especificada deve ter o mesmo proprietário e estar no mesmo esquema que a sequência. OWNED BY NONE, o padrão, especifica que essa associação não existe.

Observações

Use DROP SEQUENCE para remover uma sequência.

Como as sequências são baseadas na aritmética bigint, o intervalo não pode exceder o intervalo de um inteiro de 8 bytes (-9223372036854775808 to 9223372036854775807).

Visto que as chamadas nextval e setval nunca são revertidas, não será possível usar objetos de sequência se for necessária uma atribuição de números de sequência “sem intervalos”.

Cada sessão alocará e armazenará em cache valores de sequência sucessivos durante um acesso ao objeto de sequência e aumentará o last_value do objeto de sequência adequadamente. Em seguida, os próximos usos de cache-1 de nextval dentro dessa sessão simplesmente exibirão os valores pré-alocados, sem tocar no objeto de sequência. Portanto, quaisquer números alocados, mas não usados em uma sessão, serão perdidos quando essa sessão terminar, gerando “lacunas” na sequência.

Além disso, embora exista a garantia de que várias sessões alocarão valores de sequência distintos, os valores poderão ser gerados fora da sequência quando todas as sessões forem consideradas. Por exemplo, com uma configuração de cache de 10, a sessão A pode reservar valores 1..10 e exibir nextval=1 e a sessão B pode reservar valores 11..20 e exibir nextval=11 antes que a sessão A tenha gerado nextval=2. Portanto, com uma configuração de cache igual a um, é seguro presumir que os valores nextval serão gerados sequencialmente; com uma configuração de cache maior que um, você só deve presumir que todos os valores nextval serão distintos, não que serão gerados de uma forma puramente sequencial. Além disso, last_value exibirá o valor mais recente reservado por qualquer sessão, independentemente de ele já ter sido exibido por nextval.

Outra consideração é que a execução de setval em tal sequência não será percebida por outras sessões enquanto elas não usarem todos os valores pré-alocados que armazenaram em cache.

Exemplos

Crie uma sequência crescente chamada serial, começando com 101:

CREATE SEQUENCE serial CACHE 65536 START 101;

Selecione o próximo número dessa sequência:

SELECT nextval('serial'); nextval --------- 101

Selecione o próximo número dessa sequência:

SELECT nextval('serial'); nextval --------- 102

Use essa sequência em um comando INSERT:

INSERT INTO distributors VALUES (nextval('serial'), 'nothing');

Redefina a sequência para um valor específico usando setval:

SELECT setval('serial', 200); SELECT nextval('serial'); nextval --------- 201

Compatibilidade

CREATE SEQUENCE segue 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 padrão NEXT VALUE FOR.

  • A cláusula OWNED BY é uma extensão do PostgreSQL.