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

時間範囲が重複しないエントリを確保するにはどうすればよいですか?

    あなたは正しい方向に進んでいました。ただし、除外制約の構文 少し異なります。

    非公開のテーブル定義によっては、拡張機能をインストールする 必要がある場合があります。 (追加モジュール)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)を持つ式インデックス

    関連:

    通常、timestamptztstzrangetimestampよりも選択する必要があります (tsrange )。参照:

    たぶん 、優れた設計は、registration間の1対多の関係になります 新しいregistration_rangeのテーブルと1-Nエントリ テーブル。そして、現在有効なエントリを決定するためのいくつかのロジック(任意の時点で)。より多くの非公開情報に依存します。




    1. MySQLを時間範囲で分割

    2. データベース接続が多すぎる原因

    3. Mysqlの連続する行の距離(経度、緯度)の合計を計算するためのクエリ

    4. エラー1356(HY000):ビュー'mysql.user'が無効なテーブルまたは列または関数を参照しているか、ビューの定義者/呼び出し元にそれらを使用する権限がありません