web-dev-qa-db-fra.com

Erreur PostgreSQL EXCLUDE USING: l'entier de type de données n'a pas de classe d'opérateur par défaut

Dans PostgreSQL 9.2.3, j'essaie de créer ce tableau simplifié:

CREATE TABLE test (
    user_id INTEGER,
    startend TSTZRANGE,
    EXCLUDE USING Gist (user_id WITH =, startend WITH &&)
);

Mais je reçois cette erreur:

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.

Les les documents PostgreSQL utilisent cet exemple ce qui ne fonctionne pas pour moi:

CREATE TABLE room_reservation (
    room text,
    during tsrange,
    EXCLUDE USING Gist (room WITH =, during WITH &&)
);

Même message d'erreur.

Et celui-ci , ce qui ne fonctionne pas non plus pour moi:

CREATE TABLE Zoo (
    cage   INTEGER,
    animal TEXT,
    EXCLUDE USING Gist (cage WITH =, animal WITH <>)
);

Même message d'erreur.

Je peux créer ceci sans aucun problème:

CREATE TABLE test (
    user_id INTEGER,
    startend TSTZRANGE,
    EXCLUDE USING Gist (startend WITH &&)
);

et ça:

CREATE TABLE test (
    user_id INTEGER,
    startend TSTZRANGE,
    EXCLUDE USING btree (user_id WITH =)
);

J'ai passé pas mal de temps à chercher des astuces pour savoir comment faire fonctionner cela, ou pour comprendre pourquoi cela ne fonctionnerait pas. Des idées?

39
Ian Timothy

Installez le module supplémentaire btree_Gist comme mentionné dans le manuel à l'emplacement auquel vous vous êtes connecté :

Vous pouvez utiliser le btree_Gist extension pour définir les contraintes d'exclusion sur les types de données scalaires simples, qui peuvent ensuite être combinées avec des exclusions de plage pour une flexibilité maximale. Par exemple, après btree_Gist est installé, la contrainte suivante rejettera les plages qui se chevauchent uniquement si les numéros de salle de réunion sont égaux:

Dans PostgreSQL moderne, vous n'avez besoin d'exécuter (une fois par base de données):

CREATE EXTENSION btree_Gist;

Vous devez d'abord installer le package "contrib" dans votre système d'exploitation. Les détails dépendent de votre système d'exploitation et du référentiel logiciel utilisé. Pour la famille Debian, c'est généralement postgresql-contrib-9.2 (pour Postgres 9.2). Ou juste postgresql-contrib pour la famille Red Hat. Considérez cette réponse connexe sur SO:

30
Erwin Brandstetter

si quelqu'un ne peut pas ou ne veut pas utiliser ceci:

CREATE EXTENSION btree_Gist;

Comme dans mon cas, car Django 1.11 ORM ne prend pas en charge cet index et je ne voulais pas écrire SQL en dehors de Django. J'ai utilisé quelque chose de similaire à:

EXCLUDE USING Gist (
    int4range(userid, userid, '[]') WITH =,
    startend WITH && 
)

'[]' est utilisé pour s'assurer que les deux bornes sont inclusives. Testé avec Postgres 9.6 et 10.5.

2
Sergios Bagdasar