PostgreSQL EXCLUDE USING त्रुटि: डेटा प्रकार पूर्णांक में कोई डिफ़ॉल्ट ऑपरेटर वर्ग नहीं है


37

PostgreSQL 9.2.3 में मैं इस सरलीकृत तालिका को बनाने की कोशिश कर रहा हूँ:

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

लेकिन मुझे यह त्रुटि मिली:

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 डॉक्स इस उदाहरण का उपयोग जो मेरे लिए काम नहीं करता है:

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

एक ही त्रुटि संदेश।

और यह एक , जो मेरे लिए भी काम नहीं करता है:

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

एक ही त्रुटि संदेश।

मैं बिना किसी समस्या के इसे बनाने में सक्षम हूं:

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

और इस:

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

मैंने यह जानने में काफी समय बिताया है कि इस काम को कैसे किया जाए, या यह पता नहीं चलेगा कि यह काम क्यों नहीं करेगा। कोई विचार?


9
+1 यहाँ देखो, लोग! इसे इस तरह से किया गया है। आरडीबीएमएस और संस्करण, उदाहरण कोड, त्रुटि संदेश, समस्या की स्पष्ट परिभाषा, लिंक, ओपी ने जो कोशिश की है उसका एक प्रदर्शन : प्रश्न में यह सब कुछ है । काम करता है। आवाज नहीं। और यह पहली बार उपयोगकर्ता से है! Chapeau। मुझे करीब से देखने के लिए तुरंत राजी कर लिया।
इरविन ब्रान्डेसटेटर

2
अनुवर्ती प्रश्न: dba.stackexchange.com/questions/37391/…
Erwin Brandstetter

जवाबों:


29

अतिरिक्त मॉड्यूल स्थापित करें जो आपके द्वारा लिंक किए गए स्थान परbtree_gist मैनुअल में वर्णित है :

आप btree_gistसादे स्केलर डेटा प्रकारों पर बहिष्करण बाधाओं को परिभाषित करने के लिए विस्तार का उपयोग कर सकते हैं , जिसे फिर अधिकतम लचीलेपन के लिए सीमा बहिष्करण के साथ जोड़ा जा सकता है। उदाहरण के लिए, btree_gistस्थापित होने के बाद , निम्नलिखित बाधा ओवरलैपिंग रेंज को केवल तभी अस्वीकार कर देगी, जब बैठक कक्ष संख्या बराबर हो:

आधुनिक PostgreSQL में आपको केवल (प्रति डेटाबेस एक बार) चलाने की आवश्यकता है:

CREATE EXTENSION btree_gist;

आपको पहले अपने ओएस में "कंट्रीब" पैकेज स्थापित करना होगा। विवरण आपके OS और उपयोग किए गए सॉफ़्टवेयर रिपॉजिटरी पर निर्भर करता है। डेबियन परिवार के लिए यह आम तौर पर postgresql-contrib-9.2(पोस्टग्रैजेस 9.2 के लिए) है। या सिर्फ postgresql-contribरेड हैट परिवार के लिए। SO पर इस संबंधित उत्तर पर विचार करें:


1
यह वास्तव में मेरी कोशिश की गई पहली चीजों में से एक थी। यह एक बहुत बड़ी स्क्रिप्ट में था और यह त्रुटि संदेश आउटपुट में दफन हो गया 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 &&)...काम मेरे मूल पोस्ट में दिखाया गया है। बनाने के लिए धन्यवाद इस पर एक लाखवाँ नज़र है। अब उस त्रुटि पर शोध करना है।
इयान टिमोथी

3
@DenverTimothy: मुझे लगता है कि मैं भी इसके साथ मदद कर सकता हूं। आपको संभवतः postgresql-contrib-9.2पहले अपने ओएस में कंट्रिब पैकेज स्थापित करना होगा । आपके OS पर निर्भर करता है एसओ पर इस संबंधित जवाब पर विचार करें।
एरविन ब्रैंडसेटर

इसके अलावा, यह नोट करना उपयोगी हो सकता है कि यह portटूल के साथ स्थापित मैक ओएस 10.8.2 पर चल रहा है ।
इयान टिमोथी

@DenverTimothy: मैं मैक का उपयोग नहीं कर रहा हूं, लेकिन प्रिंसिपल समान होना चाहिए। चलाने से पहले अपने ओएस में पैकेज स्थापित करें CREATE EXTENSION
एरविन ब्रान्डेसटेटर


2

अगर कोई इसका उपयोग नहीं करना चाहता या नहीं कर सकता है:

CREATE EXTENSION btree_gist;

जैसा कि मेरे मामले में था, क्योंकि Django 1.11 ORM इस सूचकांक का समर्थन नहीं करता है और मैं Django के बाहर SQL लिखना नहीं चाहता था। मैंने कुछ इसी तरह का इस्तेमाल किया:

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

'[]' का उपयोग यह सुनिश्चित करने के लिए किया जाता है कि दोनों सीमाएँ सम्मिलित हैं। Postgres 9.6 और 10.5 के साथ परीक्षण किया गया।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.