[英]How I can define this constraint?
我正在為 Postgres 的停車場設計一個數據庫。 我需要定義一個約束(或類似的)來驗證 Ticket 中的Id_Lot
在表"Lot"
為空。
我該怎么做?
相關表格如下:
票:
"Id_Ticket" serial PRIMARY KEY,
"Date_Entrance" date NOT NULL,
"Time_Entrance" time without time zone NOT NULL,
"License_plate" varchar(6) NOT NULL references "Vehicle"("L_Plate"),
"Id_Lot" varchar(4) NOT NULL references "Lot"("Code")
很多:
"Code" varchar(4) NOT NULL PRIMARY KEY,
"Type" varchar(5) NOT NULL,
"Empty" boolean NOT NULL
假設你想強制執行:
"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 。 詳細說明:
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
基本規則:
有關的:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.