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