あなたは正しい方向に進んでいました。ただし、除外制約の構文 少し異なります。
非公開のテーブル定義によっては、btree_gist
最初。データベースごとに1回。タイプinteger
には必要な演算子クラスがインストールされていないため、私の例では必要です。 デフォルト:
CREATE EXTENSION btree_gist;
参照:
次に:
CREATE TABLE registration (
tbl_id integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY
, col_a integer NOT NULL
, col_b integer NOT NULL
, valid_from timestamp
, valid_to timestamp
, CONSTRAINT no_overlap
EXCLUDE USING gist (col_a with =, col_b with =, tsrange(valid_from, valid_to) WITH &&)
);
各列は、それぞれの演算子とともにリストする必要があります。
そして、範囲タイプが必要です 。別々の列に言及しているvalid_from
およびvalid_to
。また、tsrange
についても言及します およびvalid
失敗したコマンドで。それは紛らわしいです。 2つのtimestamp
を想定 列、式tsrange(valid_from, valid_to)
を持つ式インデックス
関連:
- これを実行しますPostgreSQLでの操作クエリの時間
- 営業時間の重複しない連続タイムスタンプ範囲(tstzrange)
- TSTZRANGEを&&で結合すると、Postgresql9.4クエリの速度が徐々に遅くなります
- 曜日と時間は?
通常、timestamptz
(tstzrange
)timestamp
よりも選択する必要があります (tsrange
)。参照:
たぶん 、優れた設計は、registration
間の1対多の関係になります 新しいregistration_range
のテーブルと1-Nエントリ テーブル。そして、現在有効なエントリを決定するためのいくつかのロジック(任意の時点で)。より多くの非公開情報に依存します。