sql >> データベース >  >> RDS >> PostgreSQL

PostgreSQLでEXCLUDEを使用して隣接/重複するエントリを防止する

    範囲タイプは下と上の境界線で構成され、含めることも除外することもできます。一般的な使用例(および範囲タイプのデフォルト)は、含めるです。 下部と除外 上限。

    重複を除く 範囲は明確なようです。マニュアルには素晴らしいコード例があります

    さらに、隣接する演算子-|-を使用して別の除外制約を作成します 隣接も除外します エントリ。どちらも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まで)。



    1. MariaDBで月と日の名前を別の言語で返す方法

    2. SQLServerで複合主キーを作成する

    3. JSON_KEYS()–MySQLのJSONオブジェクトからキーを返します

    4. Oracle Forms andReports11gリリース2のインストール