我正在为Postgres中的停车场设计一个数据库。我需要定义一个约束(或类似约束)以验证表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
函数对NOT VALID
CHECK
约束执行此操作,以检查另一个表。详细信息:
IMMUTABLE
但是您的数据模型在许多方面都不稳定。我建议使用一种更清洁的方法。
不存储批次当前是否空缺。这非常容易出错,容易出现并发问题。强制使用Disable all constraints and table checks while restoring a dump一次只能提取一次。为此,请将退出时间另存为exclusion constraint。
ticket
CREATE TABLE lot (
lot_id varchar(4) NOT NULL PRIMARY KEY -- I would use integer if possible
, lot_type text NOT NULL
);
表中没有冗余当前状态。
要使排除约束起作用,您需要附加模块lot
。详细说明:
Store the day of the week and time?
在停车持续时间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
。当汽车进入时,以上限NULL输入。汽车驶出时,以上限更新。除其他外,这还使汽车可以停放多天。
一些tsrange
附加约束,以对during
实施基本规则:
CHECK
相关:
during