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

この制約をどのように定義できますか?

    あなたが求めるものに対する解決策

    あなたがそれを強制したいと仮定して:

    1. "Id_Lot" 実際には"Lot"."Code"に存在します 。 ->FK制約
    2. "Lot"."Empty" スポットはTRUEです チェック時のみ。

    あなたはできた NOT VALIDを使用してこれを行います CHECK 偽のIMMUTABLEを使用した制約 他のテーブルをチェックする関数。詳細:

    しかし、データモデルは多くの面で不安定です。もっとクリーンなアプローチをお勧めします。

    除外制約のあるよりクリーンなデザイン

    ロットが現在、ロットと重複して空であるかどうかを保存しないでください。これは非常にエラーが発生しやすく、並行性の問題の影響を受けやすくなっています。 除外制約 。それが機能するためには、終了時間をticketに保存してください 、さらに。

    CREATE TABLE lot (
      lot_id   varchar(4) NOT NULL PRIMARY KEY  -- I would use integer if possible
    , lot_type text NOT NULL
    );
    

    lotに冗長な現在の状態はありません テーブル。

    除外制約を機能させるには、追加のモジュール btree_gist<が必要です。 / strong> 。詳細な手順:

    CREATE TABLE ticket (
      ticket_id  serial PRIMARY KEY
    , during     tsrange NOT NULL
    , license_plate text NOT NULL REFERENCES "Vehicle"("L_Plate"),
    , lot_id     int NOT NULL REFERENCES  lot
    , CONSTRAINT lot_uni_ticket EXCLUDE USING gist (lot_id WITH =, during WITH &&)
    , CONSTRAINT during_lower_bound_not_null CHECK (NOT lower_inf(during))
    , CONSTRAINT during_bounds CHECK (lower_inc(during) AND NOT upper_inc(during))
    );
    
    • タイムスタンプ範囲データ型の使用 tsrange 駐車期間中during 。車が入るとき、上限NULLで入力します。車が出るときに上限で更新します。これにより、車を複数日駐車することもできます。

    • いくつかの追加のCHECK duringに基本的なルールを適用するための制約 :

    関連:




    1. mySQLテーブルの非常に多数の列に関する専門家の意見はありますか?

    2. Not PersistText値はどういう意味ですか?

    3. SQLSTATE [23000]:整合性制約違反:1452子行を追加または更新できません:外部キー制約が失敗します

    4. PgAdminを使用してAmazonEC2インスタンスでPostgreSQLにリモートで接続できません