Помилка PostgreSQL ВИКЛЮЧЕННЯ ВИКОРИСТАННЯ: Ціле число даних не має класу операторів за замовчуванням


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 Подивіться сюди, люди! Ось як це робиться. Питання має все необхідне: RDBMS та версію, приклад коду, повідомлення про помилку, чітке визначення проблеми, посилання, відображення того, що намагалася ОП. Твори. Відсутність шуму. І це від першого користувача! Шапо. Переконав мене одразу ближче познайомитися.
Ервін Брандстеттер

Відповіді:


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. Розглянемо відповідну відповідь на ТА:


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: Я думаю, що я можу допомогти і в цьому. Ймовірно, потрібно спочатку встановити пакет contrib postgresql-contrib-9.2у вашій ОС. Залежить від вашої ОС. Розглянемо цю пов’язану відповідь на ТАК.
Ервін Брандстеттер

Також може бути корисно зауважити, що це працює на 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.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.