No PostgreSQL 9.2.3 estou tentando criar esta tabela simplificada:
CREATE TABLE test (
user_id INTEGER,
startend TSTZRANGE,
EXCLUDE USING gist (user_id WITH =, startend WITH &&)
);
Mas recebo este erro:
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.
Os documentos do PostgreSQL usam este exemplo que não funciona para mim:
CREATE TABLE room_reservation (
room text,
during tsrange,
EXCLUDE USING gist (room WITH =, during WITH &&)
);
Mesma mensagem de erro.
E este , que também não funciona para mim:
CREATE TABLE zoo (
cage INTEGER,
animal TEXT,
EXCLUDE USING gist (cage WITH =, animal WITH <>)
);
Mesma mensagem de erro.
Eu sou capaz de criar isso sem nenhum problema:
CREATE TABLE test (
user_id INTEGER,
startend TSTZRANGE,
EXCLUDE USING gist (startend WITH &&)
);
e isto:
CREATE TABLE test (
user_id INTEGER,
startend TSTZRANGE,
EXCLUDE USING btree (user_id WITH =)
);
Passei um bom tempo procurando dicas sobre como fazer isso funcionar, ou descobrir por que não funcionaria. Alguma ideia?
Instale o módulo adicional
btree_gist
conforme mencionado no manual no local ao qual você vinculou :No PostgreSQL moderno você só precisa executar (uma vez por banco de dados):
Você precisa ter o pacote "contrib" instalado em seu sistema operacional primeiro. Os detalhes dependem do seu sistema operacional e do repositório de software usado. Para a família Debian é normalmente
postgresql-contrib-13
(para Postgres 13). Ou apenaspostgresql-contrib
para a família Red Hat. Considere esta resposta relacionada no SO:se alguém não puder ou não quiser usar isso:
Como foi no meu caso, porque o Django 1.11 ORM não suporta esse índice e eu não queria escrever SQL fora do Django. Usei algo parecido com:
'[]' é usado para garantir que ambos os limites sejam inclusivos. Testado com Postgres 9.6 e 10.5.