Řešení toho, na co se ptáte
Za předpokladu, že to chcete vynutit:
"Id_Lot"
skutečně existuje v"Lot"."Code"
. -> Omezení FK"Lot"."Empty"
pro spot jeTRUE
pouze v době kontroly.
Mohli byste proveďte to pomocí NOT VALID
CHECK
omezení pomocí falešného IMMUTABLE
funkci zkontrolovat na druhém stole. Podrobnosti:
Váš datový model je však v mnoha ohledech nejistý. Navrhoval bych mnohem čistší přístup.
Čistější design s omezením vyloučení
Neukládejte, zda je šarže aktuálně prázdná, nadbytečně se šarží. To je velmi náchylné k chybám a náchylné k problémům se souběžností. Zajistěte, aby každá šarže mohla být odebrána pouze jednou pomocí omezení vyloučení
. Aby to fungovalo, uložte si čas výstupu do ticket
, navíc.
CREATE TABLE lot (
lot_id varchar(4) NOT NULL PRIMARY KEY -- I would use integer if possible
, lot_type text NOT NULL
);
Žádný redundantní aktuální stav v lot
tabulka.
Aby omezení vyloučení fungovalo, potřebujete další modul btree_gist . Podrobné pokyny:
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))
);
-
Použití datového typu rozsahu časového razítka
tsrange
po dobu parkováníduring
.Zadejte s horní hranicí NULL, když auto vjede. Aktualizujte s horní hranicí, když auto vyjede. Mimo jiné to také umožňuje, aby auta parkovala několik dní. -
Některé další
CHECK
omezení k vynucení základních pravidel naduring
:- Včetně dolní hranice, exkluzivní horní hranice, aby zůstala konzistentní.
- Nikdy nesmí chybět spodní hranice (vstup).
Související: