範囲タイプは下と上の境界線で構成され、含めることも除外することもできます。一般的な使用例(および範囲タイプのデフォルト)は、含めるです。 下部と除外 上限。
重複を除く 範囲は明確なようです。マニュアルには素晴らしいコード例があります
さらに、隣接する演算子-|-
を使用して別の除外制約を作成します 隣接も除外します エントリ。どちらもGiSTに基づいている必要があります GINは現在、このためにサポートされていないため、インデックスを作成します。
クリーンに保つために、[)
を適用します CHECK
を持つすべてのエントリの境界(下限を含み、上限を除く) 範囲関数を使用した制約:
CREATE TABLE tbl (
tbl_id serial PRIMARY KEY
, tsr tsrange
, CONSTRAINT tsr_no_overlap EXCLUDE USING gist (tsr WITH &&)
, CONSTRAINT tsr_no_adjacent EXCLUDE USING gist (tsr WITH -|-)
, CONSTRAINT tsr_enforce_bounds CHECK (lower_inc(tsr) AND NOT upper_inc(tsr))
);
db<>ここでフィドル
(古いSQLフィドル)
残念ながら、これにより2つが作成されます 論理的には、両方の除外制約を実装するための同一のGiSTインデックス。これは現在の実装の欠点のようです(少なくともPostgres 11まで)。