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


37

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.

La documentation PostgreSQL utilise cet exemple 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 , qui ne fonctionne pas pour moi non plus:

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

Même message d'erreur.

Je suis capable de 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 indices sur la manière de faire fonctionner ce travail ou sur la raison pour laquelle cela ne fonctionnerait pas. Des idées?


9
+1 Regardez ici, les gens! C'est comme ça que c'est fait. La question a tout ce dont elle a besoin: le SGBDR et la version, un exemple de code, un message d'erreur, une définition claire du problème, des liens, un affichage de ce que le PO a essayé. Les travaux. Pas de bruit. Et cela vient d'un utilisateur novice! Chapeau M'a immédiatement convaincu de regarder de plus près.
Erwin Brandstetter

Réponses:


29

Installez le module supplémentaire btree_gistcomme indiqué dans le manuel à l'emplacement auquel vous avez lié :

Vous pouvez utiliser l' btree_gistextension pour définir des contraintes d'exclusion sur des types de données scalaires standard, qui peuvent ensuite être combinées avec des exclusions de plage pour une flexibilité maximale. Par exemple, après l' btree_gistinstallation, 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 qu’à exécuter (une fois par base):

CREATE EXTENSION btree_gist;

Le paquetage "contrib" doit d’abord être installé sur votre système d’exploitation. Les détails dépendent de votre système d'exploitation et du référentiel de logiciels utilisé. Pour la famille Debian, c'est typiquement postgresql-contrib-9.2(pour Postgres 9.2). Ou juste postgresql-contribpour la famille Red Hat. Considérez cette réponse sur SO:


1
Ce fut en fait l'une des premières choses que j'ai essayées. Il était dans un script beaucoup plus grande et ce message d'erreur se est enterré dans la sortie: ERROR: could not open extension control file "/opt/local/share/postgresql92/extension/btree_gist.control": No such file or directory. J'ai également supposé qu'il était déjà installé car il ...EXCLUDE USING gist (startend WITH &&)...fonctionnait comme indiqué dans mon message d'origine. Merci de nous en occuper un millionième. Maintenant pour rechercher cette erreur.
Ian Timothy

3
@DenverTimothy: Je pense pouvoir aussi aider. Vous devez probablement d'abord installer le paquet contrib postgresql-contrib-9.2dans votre système d'exploitation. Cela dépend de votre système d'exploitation. Considérez cette réponse connexe sur SO.
Erwin Brandstetter

En outre, il peut être utile de noter que cela fonctionne sous Mac OS 10.8.2, installé avec l' portoutil.
Ian Timothy

@ DenverTimothy: Je n'utilise pas de Mac, mais le principe devrait être le même. Installez le paquet dans votre système d'exploitation avant de pouvoir l'exécuter CREATE EXTENSION.
Erwin Brandstetter


2

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

CREATE EXTENSION btree_gist;

Comme dans mon cas, parce que Django 1.11 ORM ne supporte pas cet index et que je ne voulais pas écrire du 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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.