Lỗi sử dụng PostgreSQL EXCLUDE: Số nguyên kiểu dữ liệu không có lớp toán tử mặc định


37

Trong PostgreSQL 9.2.3, tôi đang cố gắng tạo bảng đơn giản hóa này:

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

Nhưng tôi nhận được lỗi này:

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.

Các tài liệu PostgreSQL sử dụng ví dụ này không phù hợp với tôi:

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

Thông báo lỗi tương tự.

Và cái này , nó cũng không hoạt động với tôi:

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

Thông báo lỗi tương tự.

Tôi có thể tạo cái này mà không gặp vấn đề gì:

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

và cái này:

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

Tôi đã dành khá nhiều thời gian để tìm kiếm các gợi ý về việc tìm ra cách để thực hiện công việc này hoặc tìm hiểu tại sao nó không hoạt động. Có ý kiến ​​gì không?


9
+1 Nhìn vào đây, mọi người! Đó là cách nó được thực hiện. Câu hỏi có mọi thứ nó cần: RDBMS phiên bản, mã ví dụ, thông báo lỗi, định nghĩa rõ ràng về vấn đề, liên kết, hiển thị những gì OP đã thử. Các công trình. Không có tiếng ồn. Và đây là từ một người dùng lần đầu! Chapeau. Thuyết phục tôi ngay lập tức để có một cái nhìn gần hơn.
Erwin Brandstetter

Câu trả lời:


29

Cài đặt mô-đun bổ sung btree_gistnhư được đề cập trong hướng dẫn tại vị trí bạn liên kết đến :

Bạn có thể sử dụng btree_gisttiện ích mở rộng để xác định các ràng buộc loại trừ trên các loại dữ liệu vô hướng đơn giản, sau đó có thể được kết hợp với các loại trừ phạm vi để linh hoạt tối đa. Ví dụ: sau khi btree_gistđược cài đặt, các ràng buộc sau sẽ từ chối các phạm vi chồng chéo chỉ khi số phòng họp bằng nhau:

Trong PostgreSQL hiện đại, bạn chỉ cần chạy (một lần cho mỗi cơ sở dữ liệu):

CREATE EXTENSION btree_gist;

Trước tiên, bạn cần cài đặt gói "đóng góp" trong hệ điều hành của mình. Chi tiết phụ thuộc vào hệ điều hành của bạn và kho lưu trữ phần mềm được sử dụng. Đối với gia đình Debian, thông thường postgresql-contrib-9.2(đối với Postgres 9.2). Hoặc chỉ postgresql-contribdành cho gia đình Red Hat. Hãy xem xét câu trả lời liên quan này trên SO:


1
Đó thực sự là một trong những điều đầu tiên tôi đã thử. Đó là trong một tập lệnh lớn hơn nhiều và thông báo lỗi này đã bị chôn vùi trong đầu ra : ERROR: could not open extension control file "/opt/local/share/postgresql92/extension/btree_gist.control": No such file or directory. Tôi cũng cho rằng nó đã được cài đặt vì nó ...EXCLUDE USING gist (startend WITH &&)...hoạt động như trong bài viết gốc của tôi. Cảm ơn đã làm cho có một cái nhìn thứ một triệu về điều này. Bây giờ để nghiên cứu lỗi đó.
Ian Timothy

3
@DenverTimothy: Tôi nghĩ tôi cũng có thể giúp với điều đó. Bạn có thể cần phải cài đặt gói contrib postgresql-contrib-9.2trong hệ điều hành của bạn trước. Phụ thuộc vào hệ điều hành của bạn. Hãy xem xét câu trả lời liên quan này trên SO.
Erwin Brandstetter 22/03/13

Ngoài ra, có thể hữu ích khi lưu ý rằng điều này đang chạy trên Mac OS 10.8.2, được cài đặt với portcông cụ.
Ian Timothy

@DenverTimothy: Tôi không sử dụng máy Mac, nhưng hiệu trưởng phải giống nhau. Cài đặt gói trong hệ điều hành của bạn trước khi bạn có thể chạy CREATE EXTENSION.
Erwin Brandstetter


2

nếu ai đó không thể hoặc không muốn sử dụng cái này:

CREATE EXTENSION btree_gist;

Như trường hợp của tôi, vì Django 1.11 ORM không hỗ trợ chỉ mục này và tôi không muốn viết SQL bên ngoài Django. Tôi đã sử dụng một cái gì đó tương tự như:

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

'[]' Được sử dụng để đảm bảo cả hai giới hạn được bao gồm. Đã thử nghiệm với Postgres 9.6 và 10.5.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.