PostgreSQL EXCLUDE ข้อผิดพลาดในการใช้: จำนวนเต็มชนิดข้อมูลไม่มีคลาสตัวดำเนินการเริ่มต้น


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 ดูที่นี่ผู้คน! นั่นเป็นวิธีที่มันทำ คำถามมีทุกสิ่งที่ต้องการ: RDBMS และรุ่นรหัสตัวอย่างข้อความแสดงข้อผิดพลาดคำจำกัดความที่ชัดเจนของปัญหาลิงก์การแสดงสิ่งที่ OP ได้ลองทำ งาน. ไม่มีเสียงดังรบกวน และนี่คือจากผู้ใช้ครั้งแรก! Chapeau โน้มน้าวใจฉันทันทีเพื่อมองใกล้
Erwin Brandstetter

2
คำถามติดตามผล: dba.stackexchange.com/questions/37391/…
Erwin Brandstetter

คำตอบ:


29

ติดตั้งโมดูลเพิ่มเติมbtree_gistตามที่ระบุไว้ในคู่มือในตำแหน่งที่คุณเชื่อมโยงกับ :

คุณสามารถใช้btree_gistส่วนขยายเพื่อกำหนดข้อ จำกัด การยกเว้นในประเภทข้อมูลสเกลาร์ธรรมดาซึ่งสามารถรวมกับการยกเว้นช่วงเพื่อความยืดหยุ่นสูงสุด ตัวอย่างเช่นหลังจากbtree_gistติดตั้งแล้วข้อ จำกัด ต่อไปนี้จะปฏิเสธช่วงที่ทับซ้อนกันเฉพาะถ้าหมายเลขห้องประชุมเท่ากัน:

ใน PostgreSQL ที่ทันสมัยคุณจะต้องเรียกใช้ (หนึ่งครั้งต่อฐานข้อมูล):

CREATE EXTENSION btree_gist;

คุณต้องติดตั้งแพ็คเกจ "contrib" ในระบบปฏิบัติการของคุณก่อน รายละเอียดขึ้นอยู่กับระบบปฏิบัติการของคุณและที่เก็บซอฟต์แวร์ที่ใช้ สำหรับครอบครัวเดเบียนนั้นปกติแล้วpostgresql-contrib-9.2(สำหรับ Postgres 9.2) หรือเพียงแค่postgresql-contribสำหรับครอบครัว Red Hat ลองพิจารณาคำตอบที่เกี่ยวข้องกับ 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 &&)...งานตามที่แสดงในโพสต์ต้นฉบับของฉัน ขอบคุณสำหรับการสร้างที่มีล้านดูนี้ ตอนนี้การวิจัยข้อผิดพลาดที่
Ian Timothy

3
@DenverTimothy: ฉันคิดว่าฉันสามารถช่วยได้เช่นกัน คุณอาจต้องติดตั้งแพ็คเกจ contrib postgresql-contrib-9.2ในระบบปฏิบัติการของคุณก่อน ขึ้นอยู่กับระบบปฏิบัติการของคุณ ลองพิจารณาคำตอบที่เกี่ยวข้องกับ SO
Erwin Brandstetter

นอกจากนี้อาจเป็นประโยชน์หากคุณทราบว่าสิ่งนี้ทำงานบน Mac OS 10.8.2 ติดตั้งด้วยportเครื่องมือ
เอียนทิโมธี

@DenverTimothy: ฉันไม่ได้ใช้ Mac แต่ครูใหญ่ควรจะเหมือนกัน CREATE EXTENSIONติดตั้งแพคเกจในระบบปฏิบัติการของคุณก่อนที่คุณจะสามารถเรียกใช้
Erwin Brandstetter


2

หากใครบางคนไม่สามารถหรือไม่ต้องการใช้สิ่งนี้:

CREATE EXTENSION btree_gist;

อย่างที่มันเป็นในกรณีของฉันเพราะ Django 1.11 ORM ไม่รองรับดัชนีนี้และฉันไม่ต้องการเขียน SQL นอก Django ฉันใช้สิ่งที่คล้ายกับ:

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

'[]' ใช้เพื่อให้แน่ใจว่าขอบเขตทั้งสองนั้นรวมอยู่ด้วย ทดสอบกับ Postgres 9.6 และ 10.5

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.