Как PostgreSQL применяет ограничение UNIQUE/какой тип индекса он использует?

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

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

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

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

+9
источник поделиться
1 ответ

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

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

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

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

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

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

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

Другие отличия

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

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

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

Подробнее об этом более позднем ответе на dba.SE:

+16
источник

Связанные вопросы


Похожие вопросы

Посмотрите другие вопросы по меткам или Задайте вопрос