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

Como o PostgreSQL impõe a restrição UNIQUE / que tipo de índice ele usa?


ou - crie um índice e não assuma que os valores são únicos

É é seguro assumir que os valores são unique, se você tiver um índice exclusivo definido. É assim que as restrições exclusivas são implementadas (no momento, e provavelmente em todas as versões futuras também).

Definindo um UNIQUE restrição faz efetivamente o mesmo (quase, veja abaixo) como criar um índice exclusivo sem especificar o tipo de índice. E cito o manual:

As opções são btree, hash, gist e gin. O método padrão é btree.

Adicionar uma restrição é apenas a maneira canônica que não quebraria em versões futuras onde poderia ser implementado de forma diferente. Isso é tudo.

E não, uma restrição única só pode ser implementado com um btree básico index em todas as versões até e incluindo PostgreSQL v14. Cito o parágrafo "ADD table_constraint_using_index" no manual aqui:

O índice não pode ter colunas de expressão nem ser um índice parcial. Além disso, deve ser um índice de árvore b com ordenação de classificação padrão.

###Outras diferenças
  • Restrições únicas podem ser adiadas . Isso não é possível para índices exclusivos. Dê uma olhada em SET CONSTRAINTS comando e siga os links para mais.
- Uma **chave estrangeira** não pode referenciar colunas com *apenas* um índice exclusivo. [O manual:][4]

Uma chave estrangeira deve fazer referência a colunas que sejam uma chave primária ou que formem uma restrição exclusiva.

A última parte parece estar desatualizada ou um mal-entendido desde o início. Ver:
  • Valores NULL para colunas referential_constraints.unique_constraint_* no esquema de informações

Relacionado:
  • O índice exclusivo é melhor do que a restrição exclusiva quando preciso de um índice com uma classe de operador