我如何定义此约束?

问题描述 投票:1回答:1

我正在为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
database postgresql database-design constraints
1个回答
1
投票

您所要求的解决方案

假设您要强制执行:

  1. "Id_Lot"实际上存在于"Lot"."Code"中。 -> FK约束
  2. 现货的["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
© www.soinside.com 2019 - 2024. All rights reserved.