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が試行した内容の表示など、必要なものがすべて含まれています。お仕事。ノイズなし。そして、これは初めてのユーザーからです!シャポー。すぐに私がもっとよく見るように確信させました。
アーウィンブランドステッター

回答:


29

btree_gistマニュアルに記載されている追加モジュールを、リンク先の場所にインストールします。

btree_gist拡張機能を使用して、プレーンスカラーデータ型の除外制約を定義できます。これは、柔軟性を最大限にするために範囲除外と組み合わせることができます。たとえば、btree_gistインストール後、会議室番号が等しい場合にのみ、次の制約は重複する範囲を拒否します。

最新のPostgreSQLでは、実行する必要があるのは(データベースごとに1回)です。

CREATE EXTENSION btree_gist;

まず、OSに「contrib」パッケージをインストールする必要があります。詳細は、使用しているOSとソフトウェアリポジトリによって異なります。Debianファミリの場合、通常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 &&)...私の元の投稿で示したように動作したため、すでにインストールされていると仮定しました。作成していただきありがとうございます。次に、そのエラーを調査します。
イアンティモシー

3
@DenverTimothy:私もそれを手伝うことができると思います。おそらくpostgresql-contrib-9.2最初にcontribパッケージをOS にインストールする必要があり ます。OSに依存します。SOに関するこの関連する回答を検討してください。
アーウィンブランドステッター

また、portツールとともにインストールされたMac OS 10.8.2で実行されていることに注意してください。
イアンティモシー

@DenverTimothy:私はMacを使用していませんが、プリンシパルは同じでなければなりません。実行する前に、OSにパッケージをインストールしてください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でテスト済み。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.