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:
- O nome não existe. -> Criar sequência.
- Existe uma sequência com o mesmo nome. -> Não fazer nada? Alguma saída? Algum registro?
- 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