web-dev-qa-db-ja.com

PostgreSQL EXCLUDE USINGエラー:データ型整数にデフォルトの演算子クラスがありません

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 =)
);

私はこの作業を行う方法を理解するためのヒントを探すために、またはなぜそれが機能しないのかを理解するためにかなりの時間を費やしてきました。何か案は?

39
Ian Timothy

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

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

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

CREATE EXTENSION btree_Gist;

まず、OSに「contrib」パッケージをインストールする必要があります。詳細は、OSと使用するソフトウェアリポジトリによって異なります。 Debianファミリの場合、通常はpostgresql-contrib-9.2(Postgres 9.2の場合)です。または、Red Hatファミリの場合はpostgresql-contribだけです。 SOに関するこの関連する回答を検討してください。

30

誰かがこれを使用できない、または使用したくない場合:

CREATE EXTENSION btree_Gist;

私の場合と同様に、Django 1.11 ORMはこのインデックスをサポートしていないため、Djangoの外部でSQLを記述したくありませんでした。次のようなものを使用しました。

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

'[]'は、両方の境界が包括的であることを確認するために使用されます。 Postgres 9.6および10.5でテスト済み。

2