PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Como criar sequência se não existir

Postgres 9.5 ou posterior


IF NOT EXISTS foi adicionado a CREATE SEQUENCE no Postgres 9.5. Essa é a solução simples agora:
CREATE SEQUENCE IF NOT EXISTS myschema.myseq;

Mas considere os detalhes da resposta desatualizada de qualquer maneira ...
E você sabe sobre serial ou IDENTITY colunas, certo?
  • Coluna da tabela de incremento automático

Postgres 9.4 ou anterior


As sequências compartilham o namespace com vários outros objetos semelhantes a tabelas. O manual:

O nome da sequência deve ser diferente do nome de qualquer outrasequência, tabela, índice, exibição ou tabela estrangeira no mesmo esquema.

Minha ênfase em negrito. Então temos três casos:
  1. O nome não existe. -> Criar sequência.
  2. Existe uma sequência com o mesmo nome. -> Não fazer nada? Alguma saída? Algum registro?
  3. Existe outro objeto conflitante com o mesmo nome. -> Fazer alguma coisa? Alguma saída? Algum registro?

Especifique o que fazer em ambos os casos. Um DO declaração poderia ser assim:
DO
$do$
DECLARE
   _kind "char";
BEGIN
   SELECT relkind
   FROM   pg_class
   WHERE  oid = 'myschema.myseq'::regclass  -- sequence name, optionally schema-qualified
   INTO  _kind;

   IF NOT FOUND THEN       -- name is free
      CREATE SEQUENCE myschema.myseq;
   ELSIF _kind = 'S' THEN  -- sequence exists
      -- do nothing?
   ELSE                    -- object name exists for different kind
      -- do something!
   END IF;
END
$do$;

Tipos de objetos (relkind ) em pg_class de acordo com o manual:

r =tabela ordinária
i =índice
S =sequência
v =visualização
m =visualização materializada
c =tipo composto
t =tabela TOAST
f =tabela estrangeira

Relacionado:
  • Como verificar se uma tabela existe em um determinado esquema