Oplossing voor wat je vraagt
Ervan uitgaande dat u dat wilt afdwingen:
"Id_Lot"
bestaat daadwerkelijk in"Lot"."Code"
. -> FK-beperking"Lot"."Empty"
voor de plek isTRUE
alleen op het moment van de controle.
Je zou doe dit met een NOT VALID
CHECK
beperking met behulp van een nep IMMUTABLE
functie om op de andere tafel te controleren. Details:
Maar uw datamodel is in een aantal opzichten wankel. Ik zou een veel schonere aanpak willen voorstellen.
Schoner ontwerp met uitsluitingsbeperking
Sla niet overtollig leeg bij de kavel of een kavel op dit moment leeg staat. Dat is erg foutgevoelig en vatbaar voor gelijktijdigheidsproblemen. Dwing af dat elk lot slechts één keer tegelijk kan worden ingenomen met een uitsluitingsbeperking
. Om dat te laten werken, slaat u de vertrektijd op in ticket
, bovendien.
CREATE TABLE lot (
lot_id varchar(4) NOT NULL PRIMARY KEY -- I would use integer if possible
, lot_type text NOT NULL
);
Geen overbodige huidige staat in de lot
tafel.
Om de uitsluitingsbeperking te laten werken, hebt u de extra module 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))
);
-
Een gegevenstype met een tijdstempelbereik gebruiken
tsrange
voor de parkeerduurduring
.Enter met bovengrens NULL, wanneer de auto binnenkomt. Update met bovengrens bij het uitrijden van de auto. Dit maakt het onder andere ook mogelijk voor auto's om meerdere dagen te parkeren. -
Enkele aanvullende
CHECK
beperkingen om basisregels af te dwingen opduring
:- Inclusieve ondergrens, exclusieve bovengrens om consistent te blijven.
- De ondergrens (ingang) mag nooit ontbreken.
Gerelateerd: