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 eu 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 &&)
);
A 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 <>)
);
A 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 pesquisando dicas sobre como fazer isso funcionar ou sobre por que não funciona. Alguma ideia?
postgresql
constraint
installation
exclusion-constraint
gist-index
Ian Timothy
fonte
fonte
Respostas:
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 no seu sistema operacional primeiro. Os detalhes dependem do seu sistema operacional e do repositório de software usado. Para a família Debian é tipicamente
postgresql-contrib-9.2
(para o Postgres 9.2). Ou apenaspostgresql-contrib
para a família Red Hat. Considere esta resposta relacionada no SO:fonte
ERROR: could not open extension control file "/opt/local/share/postgresql92/extension/btree_gist.control": No such file or directory
. Eu também assumi que ele já estava instalado porque...EXCLUDE USING gist (startend WITH &&)...
funcionou como mostrado na minha postagem original. Obrigado por fazer um milionésimo olhar para isso. Agora, pesquise esse erro.postgresql-contrib-9.2
no seu sistema operacional primeiro. Depende do seu sistema operacional. Considere esta resposta relacionada no SO.port
ferramenta.CREATE EXTENSION
.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. Eu usei algo semelhante a:
'[]' é usado para garantir que ambos os limites sejam inclusivos. Testado com Postgres 9.6 e 10.5.
fonte