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 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