あなたが求めるものに対する解決策
あなたがそれを強制したいと仮定して:
-
"Id_Lot"
実際には"Lot"."Code"
に存在します 。 ->FK制約 "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
に基本的なルールを適用するための制約 :- 一貫性を保つための包括的下限、排他的上限。
- 下限(入口)が失われることはありません。
関連: