Kesalahan PostgreSQL EXCLUDE MENGGUNAKAN: Integer tipe data tidak memiliki kelas operator default

37

Di PostgreSQL 9.2.3 saya mencoba membuat tabel yang disederhanakan ini:

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

Tapi saya mendapatkan kesalahan ini:

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.

Dokumen PostgreSQL menggunakan contoh ini yang tidak berfungsi untuk saya:

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

Pesan kesalahan yang sama.

Dan yang ini , yang tidak bekerja untuk saya juga:

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

Pesan kesalahan yang sama.

Saya dapat membuat ini tanpa masalah:

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

dan ini:

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

Saya telah menghabiskan sedikit waktu mencari petunjuk tentang mencari tahu bagaimana membuat ini bekerja, atau mencari tahu mengapa itu tidak berhasil. Ada ide?

Ian Timothy
sumber
9
+1 Lihat di sini, semuanya! Begitulah cara melakukannya. Pertanyaannya memiliki semua yang diperlukan: RDBMS dan versi, contoh kode, pesan kesalahan, definisi masalah yang jelas, tautan, tampilan dari apa yang telah dicoba OP. Pekerjaan. Tidak ada suara Dan ini dari pengguna pertama kali! Chapeau. Meyakinkan saya segera untuk melihat lebih dekat.
Erwin Brandstetter
2
Pertanyaan tindak lanjut: dba.stackexchange.com/questions/37391/…
Erwin Brandstetter

Jawaban:

29

Instal modul tambahan btree_gistsebagaimana disebutkan dalam manual di lokasi yang Anda tautkan :

Anda dapat menggunakan btree_gistekstensi untuk menetapkan batasan pengecualian pada tipe data skalar biasa, yang kemudian dapat digabungkan dengan rentang pengecualian untuk fleksibilitas maksimum. Misalnya, setelah btree_gistdiinstal, batasan berikut akan menolak rentang yang tumpang tindih hanya jika nomor ruang pertemuan sama:

Di PostgreSQL modern Anda hanya perlu menjalankan (satu kali per basis data):

CREATE EXTENSION btree_gist;

Anda harus menginstal paket "contrib" di OS Anda terlebih dahulu. Detail tergantung pada OS Anda dan repositori perangkat lunak yang digunakan. Untuk keluarga Debian biasanya postgresql-contrib-9.2(untuk Postgres 9.2). Atau hanya postgresql-contribuntuk keluarga Red Hat. Pertimbangkan jawaban terkait ini di SO:

Erwin Brandstetter
sumber
1
Itu sebenarnya salah satu hal pertama yang saya coba. Itu dalam naskah yang jauh lebih besar dan pesan kesalahan ini mendapat dimakamkan di output: ERROR: could not open extension control file "/opt/local/share/postgresql92/extension/btree_gist.control": No such file or directory. Saya juga berasumsi itu sudah diinstal karena ...EXCLUDE USING gist (startend WITH &&)...berfungsi seperti yang ditunjukkan pada posting asli saya. Terima kasih telah membuat yang kesekian juta melihat ini. Sekarang untuk meneliti kesalahan itu.
Ian Timothy
3
@DenverTimothy: Saya pikir saya juga bisa membantu. Anda mungkin perlu menginstal paket contrib postgresql-contrib-9.2di OS Anda terlebih dahulu. Tergantung pada OS Anda. Pertimbangkan jawaban terkait ini di SO.
Erwin Brandstetter
Juga, mungkin berguna untuk mencatat bahwa ini berjalan pada Mac OS 10.8.2, diinstal dengan portalat ini.
Ian Timothy
@DenverTimothy: Saya tidak menggunakan Mac, tetapi kepala sekolah harus sama. Instal paket di OS Anda sebelum Anda dapat menjalankan CREATE EXTENSION.
Erwin Brandstetter
tautan ke utas milis postgres dengan jawaban
Eugen Konkov
2

jika seseorang tidak dapat atau tidak ingin menggunakan ini:

CREATE EXTENSION btree_gist;

Seperti dalam kasus saya, karena Django 1.11 ORM tidak mendukung indeks ini dan saya tidak ingin menulis SQL di luar Django. Saya menggunakan sesuatu yang mirip dengan:

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

'[]' digunakan untuk memastikan kedua batas inklusif. Diuji dengan Postgres 9.6 dan 10.5.

Sergios Bagdasar
sumber