繁体   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