или - создать индекс и не предполагать, что значения являются уникальными
Это является безопасно предполагать, что значения являются уникальными,если у вас есть уникальный индекс, определенный.Вот как реализуются уникальные ограничения (в настоящее время и, вероятно, также во всех будущих версиях).
Определение ограничения UNIQUE
делает фактически таким же (почти, см. Ниже)как создание уникального индекса без указания типа индекса.И я цитирую руководство :
Варианты btree, hash, gist и gin.По умолчанию используется метод btree.
Добавление ограничения - это просто канонический способ, который не будет нарушаться в будущих версиях, где оно может быть реализовано иначе.Вот и все.
И нет, уникальное ограничение может быть реализовано только с базовым индексом btree во всех версиях вплоть до PostgreSQL 9.4 включительно.Я цитирую параграф «ADD table_constraint_using_index» в руководстве здесь :
Индекс не может иметь ни столбцов выражений, ни частичного индекса.Кроме того, это должен быть индекс b-дерева с порядком сортировки по умолчанию.
Другие различия
Уникальные ограничения могут быть отсрочены .Это невозможно для уникальных индексов.Посмотрите на команду SET CONSTRAINTS
и перейдите по ссылкам для получения дополнительной информации.
A внешний ключ не может ссылаться на столбцы с просто уникальный индекс. По документации:
Внешний ключ должен ссылаться на столбцы, которые являются первичным ключом или образуют уникальное ограничение.
Более подробно в этом связанном последующем ответе на dba.SE: