PostgreSQL EXCLUDE USING error: il tipo di dati intero non ha una classe operatore predefinita


37

In PostgreSQL 9.2.3 Sto cercando di creare questa tabella semplificata:

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

Ma ottengo questo errore:

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.

I documenti PostgreSQL usano questo esempio che non funziona per me:

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

Stesso messaggio di errore.

E questo , che non funziona neanche per me:

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

Stesso messaggio di errore.

Sono in grado di creare questo senza alcun problema:

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

e questo:

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

Ho trascorso un bel po 'di tempo a cercare suggerimenti su come far funzionare questo, o capire perché non funzionerà. Qualche idea?


9
+1 Guarda qui, gente! Ecco come è fatto. La domanda ha tutto ciò di cui ha bisogno: RDBMS e versione, codice di esempio, messaggio di errore, una chiara definizione del problema, collegamenti, un display di ciò che l'OP ha provato. I lavori. Nessun rumore. E questo è da un utente per la prima volta! Chapeau. Mi ha convinto immediatamente a dare un'occhiata più da vicino.
Erwin Brandstetter,

Risposte:


29

Installa il modulo aggiuntivo btree_gistcome indicato nel manuale nella posizione a cui sei collegato :

È possibile utilizzare l' btree_gistestensione per definire vincoli di esclusione su tipi di dati scalari semplici, che possono quindi essere combinati con esclusioni di intervallo per la massima flessibilità. Ad esempio, dopo l' btree_gistinstallazione, il seguente vincolo rifiuterà gli intervalli sovrapposti solo se i numeri della sala riunioni sono uguali:

Nel moderno PostgreSQL devi solo eseguire (una volta per database):

CREATE EXTENSION btree_gist;

Devi prima avere il pacchetto "contrib" installato nel tuo sistema operativo. I dettagli dipendono dal sistema operativo in uso e dal repository software utilizzato. Per la famiglia Debian è in genere postgresql-contrib-9.2(per Postgres 9.2). O solo postgresql-contribper la famiglia Red Hat. Considera questa risposta correlata su SO:


1
Questa è stata in realtà una delle prime cose che ho provato. Era in uno script molto più grande e questo messaggio di errore ha sepolto nell'output: ERROR: could not open extension control file "/opt/local/share/postgresql92/extension/btree_gist.control": No such file or directory. Ho anche pensato che fosse già installato perché ...EXCLUDE USING gist (startend WITH &&)...funzionava come mostrato nel mio post originale. Grazie per averci dato un milionesimo. Ora per cercare quell'errore.
Ian Timothy,

3
@DenverTimothy: penso di poter aiutare anche con quello. Probabilmente devi prima installare il pacchetto contrib postgresql-contrib-9.2nel tuo sistema operativo. Dipende dal tuo sistema operativo. Considera questa risposta correlata su SO.
Erwin Brandstetter,

Inoltre, potrebbe essere utile notare che questo è in esecuzione su Mac OS 10.8.2, installato con lo portstrumento.
Ian Timothy,

@DenverTimothy: non sto usando i Mac, ma il principale dovrebbe essere lo stesso. Installa il pacchetto nel tuo sistema operativo prima di poter eseguire CREATE EXTENSION.
Erwin Brandstetter,


2

se qualcuno non può o non vuole usare questo:

CREATE EXTENSION btree_gist;

Come nel mio caso, perché Django 1.11 ORM non supporta questo indice e non volevo scrivere SQL al di fuori di Django. Ho usato qualcosa di simile a:

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

'[]' viene utilizzato per assicurarsi che entrambi i limiti siano inclusivi. Testato con Postgres 9.6 e 10.5.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.