Как PostgreSQL обеспечивает ограничение UNIQUE / какой тип индекса он использует? - PullRequest
11 голосов
/ 30 января 2012

Я пытался разобраться в связи между уникальным и индексом в Postgres после прочтения документов по уникальности индекса, являющихся подробностями реализации :

Предпочтительным способом добавления уникального ограничения в таблицу является ALTER TABLE ... ADD CONSTRAINT. Использование индексов для обеспечения уникальности ограничения могут рассматриваться как деталь реализации, которая должна не быть доступным напрямую. Однако следует помнить, что есть нет необходимости вручную создавать индексы для уникальных столбцов; делать это будет просто продублируйте автоматически созданный индекс.

Итак, взяв документы на себя, я собираюсь просто объявить вещи уникальными и использовать неявный индекс - или - создать индекс, а не предполагать, что значения уникальны. Это ошибка?

Какой индекс я получу от уникального? Учитывая, что только btree примет ограничение уникальности, а уникальный неявно создает индекс, верно ли, что UNIQUE создает индекс btree? Я не хочу случайно запускать диапазоны по хеш-индексу.

1 Ответ

19 голосов
/ 30 января 2012

или - создать индекс и не предполагать, что значения являются уникальными

Это является безопасно предполагать, что значения являются уникальными,если у вас есть уникальный индекс, определенный.Вот как реализуются уникальные ограничения (в настоящее время и, вероятно, также во всех будущих версиях).

Определение ограничения UNIQUE делает фактически таким же (почти, см. Ниже)как создание уникального индекса без указания типа индекса.И я цитирую руководство :

Варианты btree, hash, gist и gin.По умолчанию используется метод btree.

Добавление ограничения - это просто канонический способ, который не будет нарушаться в будущих версиях, где оно может быть реализовано иначе.Вот и все.

И нет, уникальное ограничение может быть реализовано только с базовым индексом btree во всех версиях вплоть до PostgreSQL 9.4 включительно.Я цитирую параграф «ADD table_constraint_using_index» в руководстве здесь :

Индекс не может иметь ни столбцов выражений, ни частичного индекса.Кроме того, это должен быть индекс b-дерева с порядком сортировки по умолчанию.

Другие различия

  • Уникальные ограничения могут быть отсрочены .Это невозможно для уникальных индексов.Посмотрите на команду SET CONSTRAINTS и перейдите по ссылкам для получения дополнительной информации.

  • A внешний ключ не может ссылаться на столбцы с просто уникальный индекс. По документации:

    Внешний ключ должен ссылаться на столбцы, которые являются первичным ключом или образуют уникальное ограничение.

Более подробно в этом связанном последующем ответе на dba.SE:

...