あなたは正しい方向に進んでいました。ただし、除外制約の構文 少し異なります。
非公開のテーブル定義によっては、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エントリ テーブル。そして、現在有効なエントリを決定するためのいくつかのロジック(任意の時点で)。より多くの非公開情報に依存します。