В 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 =)
);
Я потратил довольно много времени в поисках подсказок, чтобы выяснить, как заставить это работать, или выяснить, почему это не будет работать. Любые идеи?
Ответы:
Установите дополнительный модуль,
btree_gist
как указано в руководстве, по адресу, указанному вами :В современном PostgreSQL вам нужно всего лишь запустить (один раз для каждой базы данных):
Вам необходимо сначала установить пакет contrib в вашей ОС. Детали зависят от вашей ОС и используемого репозитория программного обеспечения. Для семейства Debian это обычно
postgresql-contrib-9.2
(для Postgres 9.2). Или простоpostgresql-contrib
для семьи Red Hat. Рассмотрите этот связанный ответ на SO:источник
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 &&)...
работал, как показано в моем оригинальном посте. Спасибо за то, что сделали миллионный взгляд на это. Теперь, чтобы исследовать эту ошибку.postgresql-contrib-9.2
вам сначала нужно установить пакет contrib в вашей ОС. Зависит от вашей ОС. Рассмотрим этот связанный ответ на SO.port
инструмента.CREATE EXTENSION
.если кто-то не может или не хочет использовать это:
Как и в моем случае, потому что Django 1.11 ORM не поддерживает этот индекс, и я не хотел писать SQL вне Django. Я использовал что-то похожее на:
«[]» используется, чтобы убедиться, что обе границы включены. Протестировано с Postgres 9.6 и 10.5.
источник