Помилка 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.