CREATE [ TEMPORARY | TEMP ] SEQUENCE nome [ INCREMENT [ BY ] incremento ] [ MINVALUE valor_mínimo | NO MINVALUE ] [ MAXVALUE valor_máximo | NO MAXVALUE ] [ START [ WITH ] início ] [ CACHE cache ] [ [ NO ] CYCLE ]
O comando CREATE SEQUENCE cria um gerador de números seqüenciais, o que envolve a criação e a inicialização de uma tabela especial com uma única linha chamada nome. O usuário que executa o comando se torna o dono do gerador.
Se for fornecido o nome do esquema então a seqüência será criada no esquema especificado, senão será criada no esquema corrente. As seqüências temporárias são criadas em um esquema especial e, portanto, não pode ser fornecido o nome do esquema ao se criar uma seqüência temporária. O nome da seqüência deve ser distinto do nome de qualquer outra seqüência, tabela, índice ou visão no mesmo esquema.
Após a seqüência ser criada, podem ser utilizadas as funções nextval, currval e setval para operar na seqüência. Estas funções estão documentadas na Seção 9.12. [1] [2] [3] [4]
Embora não seja possível atualizar uma seqüência diretamente, pode ser feita uma consulta como
SELECT * FROM nome;
para examinar os parâmetros e o estado atual da seqüência. Em particular, o campo last_value da seqüência mostra o último valor alocado para alguma sessão (É claro que este valor poderá estar obsoleto no instante em que for exibido, se outras sessões estiverem chamando a função nextval).
Se for especificado, o objeto de seqüência será criado somente para esta sessão, sendo automaticamente removido ao término da sessão. Enquanto existirem seqüências temporárias com o mesmo nome, as seqüências permanentes existentes não estarão visíveis (pela sessão), a não ser que sejam referenciadas por um nome qualificado pelo esquema.
O nome (opcionalmente qualificado pelo esquema) da seqüência a ser criada.
A cláusula opcional INCREMENT BY incremento especifica o valor a ser adicionado ao valor corrente da seqüência para gerar o novo valor. Um valor positivo cria uma seqüência ascendente, enquanto um valor negativo cria uma seqüência descendente. O valor padrão é 1.
A cláusula opcional MINVALUE valor_mínimo determina o valor mínimo que a seqüência pode gerar. Se esta cláusula não for fornecida, ou for especificado NO MINVALUE, então serão utilizados os valores padrão. Os valores padrão são 1 e -263-1 para seqüências ascendentes e descendentes, respectivamente.
A cláusula opcional MAXVALUE valor_máximo determina o valor máximo que a seqüência pode gerar. Se esta cláusula não for fornecida, ou for especificado NO MAXVALUE, então serão utilizados os valores padrão. Os valores padrão são 263-1 e -1 para seqüências ascendentes e descendentes, respectivamente.
A cláusula opcional START WITH início permite a seqüência iniciar com qualquer valor. O valor inicial padrão é o valor_mínimo para seqüências ascendentes, e o valor_máximo para seqüências descendentes.
A cláusula opcional CACHE cache especifica quantos números da seqüência devem ser pré-alocados e armazenados em memória para acesso mais rápido. O valor mínimo é 1 (somente um valor é gerado de cada vez, ou seja, sem cache), e este também é o valor padrão.
A opção CYCLE permite que a seqüência recomece quando for atingido o valor_máximo ou o valor_mínimo por uma seqüê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, toda chamada a nextval após a seqüência ter atingido seu valor máximo retornará um erro. Se não for especificado nem CYCLE nem NO CYCLE, NO CYCLE é o padrão.
Para remover uma seqüência deve ser utilizado o comando DROP SEQUENCE.
As seqüências são baseadas na aritmética do tipo bigint e, portanto, a faixa de valores não pode exceder a faixa de um número inteiro de 8 bytes (-9223372036854775808 a 9223372036854775807). Em algumas plataformas mais antigas, pode não haver suporte do compilador para números inteiros de 8 bytes e, neste caso, as seqüências utilizam a aritmética do tipo integer regular (faixa de valores de -2147483648 a +2147483647).
Se for utilizada uma definição de cache maior que 1, para um objeto de seqüência que será utilizado ao mesmo tempo por várias sessões, poderão ocorrer resultados não esperados. Cada sessão irá alocar e armazenar no cache valores sucessivos da seqüência durante um acesso ao objeto de seqüência, e ajustar o valor de last_value do objeto de seqüência da forma apropriada. Depois disso, as próximas cache-1 utilizações de nextval pela sessão simplesmente retornarão os valores alocados anteriormente, sem acessar o objeto de seqüência. Portanto, todos os números alocados, mas não utilizados pela sessão, serão perdidos quando a sessão terminar, produzindo "buracos" na seqüência.
Além disso, embora haja garantia que as várias sessões alocam valores distintos da seqüência, os valores podem ser gerados fora de ordem quando são levadas em consideração todas as sessões. Por exemplo, definindo-se cache igual a 10, a sessão A pode reservar os valores 1..10 e retornar nextval=1, enquanto a sessão B pode reservar os valores 11..20 e retornar nextval=11 antes da sessão A ter gerado nextval=2. Portanto, com uma definição de cache igual a um é seguro assumir que os valores de nextval são gerados seqüencialmente; com uma definição de cache maior do que um apenas pode-se assumir que os valores de nextval são todos distintos, mas não que sejam gerados de forma inteiramente seqüencial. Também, o valor last_value reflete o último valor gerado por qualquer sessão, tenha ou não sido retornado por nextval.
Outra consideração a ser feita é que, neste tipo de seqüência, a execução de setval não será percebida pelas outras sessões enquanto estas não utilizarem todos os valores alocados armazenados no cache.
Criar uma seqüência ascendente chamada serial, começando por 101:
CREATE SEQUENCE serial START 101;
Selecionar o próximo valor desta seqüência:
SELECT nextval('serial'); nextval --------- 114
Se a função nextval for chamada duas vezes no mesmo comando a seqüência será incrementada duas vezes: [5]
SELECT nextval('serial'), nextval('serial'); nextval | nextval ---------+--------- 115 | 116
Para que a seqüência não seja incrementada duas vezes deve ser utilizada a função nextval uma vez e currval na vez seguinte: [6]
SELECT nextval('serial'), currval('serial'); nextval | currval ---------+--------- 117 | 117
Utilizar esta seqüência no comando INSERT:
INSERT INTO distribuidores VALUES (nextval('serial'), 'nada');
Atualizar o valor da seqüência após executar o comando COPY FROM:
BEGIN; COPY distribuidores FROM 'arquivo_de_entrada'; SELECT setval('serial', max(id)) FROM distribuidores; END;
Criar uma seqüência temporária que retorna um valor constante igual a área do Brasil (8.500.000 km2) [7]
CREATE TEMPORARY SEQUENCE area_brasil INCREMENT BY 2 MINVALUE 8500000 MAXVALUE 8500001 START WITH 8500000 CYCLE CACHE 1;
Testar a seqüência para ver se retorna um valor constante:
SELECT nextval('area_brasil') AS "Área do Brasil (km2)"; Área do Brasil (km2) ---------------------- 8500000 (1 linha) SELECT nextval('area_brasil') AS "Área do Brasil (km2)"; Área do Brasil (km2) ---------------------- 8500000 (1 linha)
O comando CREATE SEQUENCE está especificado no SQL:2003. O PostgreSQL está em conformidade com o padrão, com as seguintes exceções:
A expressão do padrão AS <data type> não é suportada.
A obtenção do próximo valor é feita usando a função nextval() em vez da expressão do padrão NEXT VALUE FOR.
[1] |
Oracle — O comando CREATE SEQUENCE é utilizado para criar uma seqüência, que é um objeto do banco de dados a partir do qual vários usuários podem gerar inteiros únicos. As seqüências podem ser utilizadas para gerar automaticamente valores para chave primária. Quando o número da seqüência é gerado a seqüência é incrementada, independentemente da transação ser efetivada ou desfeita. Se dois usuários incrementarem ao mesmo tempo a mesma seqüência, então os números da seqüência obtidos por cada usuário serão descontínuos, porque números da seqüência estão sendo gerados pelo outro usuário também. Um usuário nunca pode obter o número da seqüência gerado pelo outro usuário. Uma vez que o valor da seqüência seja gerado por um usuário, este usuário poderá continuar a acessar este valor sem se preocupar se a seqüência está sendo incrementada por outro usuário. Os números da seqüência são gerados independentemente das tabelas, portanto a mesma seqüência pode ser utilizada para uma ou para várias tabelas. É possível que os números individuais da seqüência pareçam estar saltados, porque foram gerados e utilizados por uma transação que foi desfeita. Além disso, um usuário não pode saber o que os outros usuários estão fazendo com os números da mesma seqüência. Uma vez que a seqüência tenha sido criada, seus valores poderão ser acessados por comandos SQL com a pseudocoluna CURRVAL, que retorna o valor corrente da seqüência, ou com a pseudocoluna NEXTVAL, que incrementa a seqüência e retorna o novo valor. Oracle® Database SQL Reference 10g Release 1 (10.1) Part Number B10759-01 (N. do T.) |
[2] |
Oracle — A pseudocoluna se comporta como uma coluna de tabela, mas não é realmente armazenada em uma tabela. As pseudocolunas podem ser consultadas, mas não se pode inserir, atualizar ou excluir seus valores. Oracle® Database SQL Reference 10g Release 1 (10.1) Part Number B10759-01 (N. do T.) |
[3] |
DB2 — O comando CREATE SEQUENCE define uma seqüência no servidor de aplicativos. DB2 Version 9 for Linux, UNIX, and Windows (N. do T.) |
[4] |
DB2 — Criando seqüências — A seqüência é um objeto do banco de dados que permite a geração automática de valores. As seqüências são ideais para a tarefa de gerar valores de chave únicos. Os aplicativos podem utilizar seqüências para evitar possíveis problemas de simultaneidade e desempenho resultantes da geração de um contador único externo ao banco de dados. Restrições — Diferentemente do atributo coluna de identidade, a seqüência não está relacionada a uma determinada coluna de tabela, nem está restrita a uma única coluna de tabela e somente acessível através desta coluna de tabela. Se um banco de dados que contém uma ou mais seqüências for recuperado para um ponto anterior no tempo, então isto poderá causar a geração de valores duplicados para algumas seqüências. Para evitar a possibilidade de valores duplicados, os bancos de dados com seqüências não devem ser recuperados para um ponto anterior no tempo. Existem várias restrições relativas a onde as expressões NEXTVAL e PREVVAL podem ser usadas. Procedimento — A expressão NEXTVAL retorna o próximo valor da seqüência especificada. É gerado um novo número da seqüência quando a expressão NEXTVAL especifica o nome da seqüência. Entretanto, se existirem várias instâncias da expressão NEXTVAL especificando o mesmo nome de seqüência dentro do comando, o contador para a seqüência é incrementado somente uma vez para cada linha do resultado, e todas as instâncias de NEXTVAL retornam o mesmo valor para a linha do resultado. A expressão PREVVAL retorna o valor gerado mais recentemente para a seqüência especificada para o comando anterior dentro do processo aplicativo corrente. DB2 Version 9 for Linux, UNIX, and Windows (N. do T.) |
[5] |
Exemplo escrito pelo tradutor, não fazendo parte do manual original. |
[6] |
Exemplo escrito pelo tradutor, não fazendo parte do manual original. |
[7] |
Exemplo escrito pelo tradutor, não fazendo parte do manual original. |