PostgreSQL EXCLUDE KULLANIM HATASI: Veri tipi tamsayısının varsayılan operatör sınıfı yok


37

PostgreSQL 9.2.3'te bu basitleştirilmiş tabloyu oluşturmaya çalışıyorum:

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

Ancak bu hatayı alıyorum:

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.

PostgreSQL dokümanlar Bu örneği kullanmak benim için çalışmaz:

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

Aynı hata mesajı.

Ve bu benim için de işe yaramıyor:

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

Aynı hata mesajı.

Bunu sorunsuz bir şekilde oluşturabiliyorum:

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

ve bu:

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

Bu işin nasıl yapıldığını ya da neden işe yaramayacağını bulmak için ipuçlarını aramaya epey zaman harcadım. Herhangi bir fikir?


9
+1 Buraya bakın millet! İşte böyle yapılır. Soru, ihtiyaç duyduğu her şeye sahip: RDBMS ve versiyonu, örnek kod, hata mesajı, sorunun açık bir tanımı, linkler, OP'nin denediği şeyin bir ekranı. İşler. Ses yok. Ve bu ilk kez bir kullanıcıdan! Chapeau. Daha yakından bakmak için beni hemen ikna etti.
Erwin Brandstetter

Yanıtlar:


29

Ek modülü btree_gistkılavuzda belirtildiği şekilde bağlantı kurduğunuz yere yerleştirin :

btree_gistUzantıyı, düz skalar veri türlerinde dışlama kısıtlamaları tanımlamak için kullanabilirsiniz; bu daha sonra maksimum esneklik için aralık dışlamaları ile birleştirilebilir. Örneğin, kurulduktan sonra btree_gist, aşağıdaki kısıtlama, yalnızca toplantı odası sayıları eşit olduğunda çakışan aralıkları reddeder:

Modern PostgreSQL'de yalnızca çalıştırmanız gerekir (veritabanı başına bir kez):

CREATE EXTENSION btree_gist;

Önce işletim sisteminize "katkı" paketini yüklemeniz gerekir. Ayrıntılar işletim sisteminize ve kullanılan yazılım havuzuna bağlıdır. Debian ailesi için bu genellikle postgresql-contrib-9.2(Postgres 9.2 için). Ya da sadece postgresql-contribRed Hat ailesi için. SO ile ilgili bu cevabı düşünün:


1
Bu aslında denedim ilk şeylerden biriydi. Bu çok daha büyük bir senaryo olduğunu ve bu hata mesajı çıktı gömüldü: ERROR: could not open extension control file "/opt/local/share/postgresql92/extension/btree_gist.control": No such file or directory. ...EXCLUDE USING gist (startend WITH &&)...Orijinal gönderide gösterildiği gibi çalıştığı için zaten kurulu olduğunu varsaydım . Buna bir milyonuncu bakış attığın için teşekkürler. Şimdi bu hatayı araştırmak için.
Ian Timothy

3
@DenverTimothy: Bu konuda da yardımcı olabileceğimi düşünüyorum. Büyük olasılıkla, katkı paketini postgresql-contrib-9.2önce işletim sisteminize yüklemeniz gerekir . İşletim sisteminize bağlı. SO ile ilgili bu cevabı düşünün.
Erwin Brandstetter

Ayrıca, bunun araçla birlikte yüklenen Mac OS 10.8.2'de çalıştığını unutmayın port.
Ian Timothy

@DenverTimothy: Mac kullanmıyorum, ancak asıl aynı olmalı. Çalıştırmadan önce paketi işletim sisteminize yükleyin CREATE EXTENSION.
Erwin Brandstetter


2

Birisi bunu kullanamazsa veya istemiyorsa:

CREATE EXTENSION btree_gist;

Benim durumumda olduğu gibi, çünkü Django 1.11 ORM bu indeksi desteklemiyor ve SQL'i Django dışında yazmak istemedim. Benzer bir şey kullandım:

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

'[]' her iki sınırın kapsayıcı olduğundan emin olmak için kullanılır. Postgres 9.6 ve 10.5 ile test edilmiştir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.