簡體   English   中英

我如何定義這個約束?

[英]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

您所問的解決方案

假設你想強制執行:

  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 詳細說明:

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))
);

有關的:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM