PostgreSQL EXCLUDE USING error: тип данных integer не имеет класса оператора по умолчанию

37

В PostgreSQL 9.2.3 я пытаюсь создать эту упрощенную таблицу:

CREATE TABLE test (
    user_id INTEGER,
    startend TSTZRANGE,
    EXCLUDE USING gist (user_id WITH =, startend WITH &&)
);

Но я получаю эту ошибку:

ERROR:  data type integer has no default operator class for access method "gist"
HINT:  You must specify an operator class for the index or define
       a default operator class for the data type.

Документы PostgreSQL используют этот пример, который мне не подходит:

CREATE TABLE room_reservation (
    room text,
    during tsrange,
    EXCLUDE USING gist (room WITH =, during WITH &&)
);

То же сообщение об ошибке.

И этот , который не работает для меня также:

CREATE TABLE zoo (
    cage   INTEGER,
    animal TEXT,
    EXCLUDE USING gist (cage WITH =, animal WITH <>)
);

То же сообщение об ошибке.

Я могу создать это без каких-либо проблем:

CREATE TABLE test (
    user_id INTEGER,
    startend TSTZRANGE,
    EXCLUDE USING gist (startend WITH &&)
);

и это:

CREATE TABLE test (
    user_id INTEGER,
    startend TSTZRANGE,
    EXCLUDE USING btree (user_id WITH =)
);

Я потратил довольно много времени в поисках подсказок, чтобы выяснить, как заставить это работать, или выяснить, почему это не будет работать. Любые идеи?

Ян Тимоти
источник
9
+1 Смотри сюда, люди! Вот как это делается. В вопросе есть все, что нужно: СУБД и версия, пример кода, сообщение об ошибке, четкое определение проблемы, ссылки, отображение того, что пытался ФП. Работы. Нет шума. И это от нового пользователя! Вводная. Убедил меня немедленно взглянуть поближе.
Эрвин Брандштеттер,
2
Дополнительный вопрос: dba.stackexchange.com/questions/37391/…
Эрвин Брандштеттер,

Ответы:

29

Установите дополнительный модуль, btree_gistкак указано в руководстве, по адресу, указанному вами :

btree_gistРасширение можно использовать для определения ограничений исключения для простых скалярных типов данных, которые затем можно комбинировать с исключениями диапазона для максимальной гибкости. Например, после btree_gistустановки следующее ограничение будет отклонять перекрывающиеся диапазоны, только если номера комнаты собраний равны:

В современном PostgreSQL вам нужно всего лишь запустить (один раз для каждой базы данных):

CREATE EXTENSION btree_gist;

Вам необходимо сначала установить пакет contrib в вашей ОС. Детали зависят от вашей ОС и используемого репозитория программного обеспечения. Для семейства Debian это обычно postgresql-contrib-9.2(для Postgres 9.2). Или просто postgresql-contribдля семьи Red Hat. Рассмотрите этот связанный ответ на SO:

Эрвин Брандштеттер
источник
1
Это было одно из первых, что я попробовал. Это было в гораздо большей сценарий , и это сообщение об ошибке похоронили на выходе: ERROR: could not open extension control file "/opt/local/share/postgresql92/extension/btree_gist.control": No such file or directory. Я также предположил, что это было установлено уже, потому что ...EXCLUDE USING gist (startend WITH &&)...работал, как показано в моем оригинальном посте. Спасибо за то, что сделали миллионный взгляд на это. Теперь, чтобы исследовать эту ошибку.
Ян Тимоти
3
@DenverTimothy: Думаю, я тоже могу помочь с этим. Возможно, postgresql-contrib-9.2вам сначала нужно установить пакет contrib в вашей ОС. Зависит от вашей ОС. Рассмотрим этот связанный ответ на SO.
Эрвин Брандштеттер,
Также может быть полезно отметить, что это работает в Mac OS 10.8.2, установленной с помощью portинструмента.
Ян Тимоти
@DenverTimothy: я не использую Mac, но принцип должен быть таким же. Установите пакет в вашей ОС, прежде чем вы сможете запустить CREATE EXTENSION.
Эрвин Брандштеттер
2

если кто-то не может или не хочет использовать это:

CREATE EXTENSION btree_gist;

Как и в моем случае, потому что Django 1.11 ORM не поддерживает этот индекс, и я не хотел писать SQL вне Django. Я использовал что-то похожее на:

EXCLUDE USING gist (
    int4range(userid, userid, '[]') WITH =,
    startend WITH && 
)

«[]» используется, чтобы убедиться, что обе границы включены. Протестировано с Postgres 9.6 и 10.5.

Сержиос Багдасар
источник