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 여기 사람들! 그게 끝났어. 이 질문에는 RDBMS 버전, 예제 코드, 오류 메시지, 명확한 문제 정의, 링크, OP가 시도한 결과 표시 등 필요한 모든 것이 있습니다. 작품. 소음이 없습니다. 그리고 이것은 최초의 사용자입니다! Chapeau. 즉시 더 자세히 살펴 보라고 확신했습니다.
Erwin Brandstetter

답변:


29

링크 된 위치에서btree_gist 매뉴얼 언급 된대로 추가 모듈 을 설치하십시오 .

btree_gist확장을 사용하여 일반 스칼라 데이터 유형에 대한 제외 제약 조건을 정의한 다음 최대한의 유연성을 위해 범위 제외와 결합 할 수 있습니다. 예를 들어 btree_gist설치 후 다음 제한 조건은 미팅 룸 번호가 동일한 경우에만 겹치는 범위를 거부합니다.

최신 PostgreSQL에서는 데이터베이스 당 한 번만 실행하면됩니다.

CREATE EXTENSION btree_gist;

먼저 "contrib"패키지를 OS에 설치해야합니다. 세부 사항은 사용중인 OS 및 소프트웨어 저장소에 따라 다릅니다. 데비안 제품군의 경우 일반적으로 postgresql-contrib-9.2Postgres 9.2입니다. 또는 postgresql-contribRed 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 &&)...원래 게시물에 표시된대로 작동 했기 때문에 이미 설치되었다고 가정했습니다 . 이것을 백만 분의 일을 봐 주셔서 감사합니다. 이제 그 오류를 연구하십시오.
이안 티모시

3
@ DenverTimothy : 나도 도울 수 있다고 생각합니다. contrib 패키지 postgresql-contrib-9.2를 먼저 OS에 설치해야합니다 . 운영 체제에 따라 다릅니다. SO에 대한 관련 답변을 고려하십시오.
Erwin Brandstetter

또한이 port도구 와 함께 설치된 Mac OS 10.8.2에서 실행되고 있음을 알아두면 도움이 될 수 있습니다 .
Ian Timothy

@ DenverTimothy : 나는 Mac을 사용하지 않지만 교장은 동일해야합니다. 실행하기 전에 OS에 패키지를 설치하십시오 CREATE EXTENSION.
Erwin Brandstetter


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로 테스트되었습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.