PostgreSQL: nomes de restrição padrão

88

Ao criar uma tabela no PostgreSQL, os nomes de restrição padrão serão atribuídos se não forem fornecidos:

CREATE TABLE example (
    a integer,
    b integer,
    UNIQUE (a, b)
);

Mas usar ALTER TABLEpara adicionar uma restrição parece que um nome é obrigatório:

ALTER TABLE example ADD CONSTRAINT my_explicit_constraint_name UNIQUE (a, b);

Isso causou algumas inconsistências de nomenclatura em projetos em que trabalhei e suscita as seguintes perguntas:

  1. Existe uma maneira simples de adicionar uma restrição a uma tabela existente com o nome que ela teria recebido se adicionada durante a criação da tabela?

  2. Caso contrário, os nomes padrão devem ser evitados para evitar inconsistências?

Ian Mackinnon
fonte
3
Eu faço uma regra para evitar nomes padrão apenas por este motivo - você acaba com a situação em que em cada implantação as restrições têm nomes diferentes.
Paul Tomblin

Respostas:

36

O manual é bastante claro sobre isso (" tableconstraint: Este formulário adiciona uma nova restrição a uma tabela usando a mesma sintaxe de CREATE TABLE. ")

Então você pode simplesmente executar:

Exemplo de ALTER TABLE ADD UNIQUE (a, b);
um cavalo sem nome
fonte
5
Ah! Eu estava incluindo erroneamente CONSTRAINTcomo ALTER TABLE example ADD CONSTRAINT UNIQUE (a, b);e recebendo erros. Obrigado!
Ian Mackinnon
282

Os nomes padrão para índices no PostgreSQL são:

{tablename}_{columnname(s)}_{suffix}

onde o sufixo é um dos seguintes:

  • pkey para uma restrição de chave primária
  • key para uma restrição única
  • excl para uma restrição de exclusão
  • idx para qualquer outro tipo de índice
  • fkey para uma chave estrangeira
  • check para uma restrição Check

O sufixo padrão para sequências é

  • seq para todas as sequências

Prova de sua restrição UNIQUE:

AVISO: CREATE TABLE / UNIQUE criará o índice implícito "example_a_b_key" para a tabela "example"

Frank Heikens
fonte
10
Muito útil, obrigado! Vale a pena acrescentar que as chaves estrangeiras usam o sufixo fkeye que as restrições de chave estrangeira de várias colunas parecem incluir apenas o nome da primeira coluna.
Ian Mackinnon
1
@IanMackinnon, Essa deve ser a melhor resposta!
Marcio Mazzucato
Esta informação é ouro! Você pode confirmá-los executando, por exemplo,CREATE TABLE mytable (mycolumn numeric UNIQUE);
jmagnusson
6
Exatamente a resposta que eu procurava ao pesquisar no Google "convenções de nomenclatura do índice postgresql"
Fancy John
1
@alguém ah desculpe, acho que quis dizer o fim de E.4.3.3 Comandos de utilitário. É o último item de marcador antes de E.4.3.4 Tipos de dados: "Use os nomes de todas as colunas-chave ao selecionar nomes de restrição padrão para chaves estrangeiras (Peter Eisentraut)"
Michael Hewson