Lösning för det du frågar
Förutsatt att du vill genomdriva det:
"Id_Lot"
finns faktiskt i"Lot"."Code"
. -> FK-begränsning"Lot"."Empty"
för platsen ärTRUE
endast vid tidpunkten för kontrollen.
Du kunde gör detta med en NOT VALID
CHECK
begränsning som använder en falsk IMMUTABLE
funktion för att kontrollera på den andra tabellen. Detaljer:
Men din datamodell är skakig i ett antal aspekter. Jag skulle föreslå ett mycket renare tillvägagångssätt.
Renare design med uteslutningsbegränsning
Lagra inte om en del för närvarande är tom överflödig med partiet. Det är mycket felbenäget och känsligt för samtidiga problem. Se till att varje lot bara kan tas en gång i taget med en uteslutningsbegränsning
. För att det ska fungera, spara tiden för utträde i ticket
, dessutom.
CREATE TABLE lot (
lot_id varchar(4) NOT NULL PRIMARY KEY -- I would use integer if possible
, lot_type text NOT NULL
);
Inget redundant aktuellt tillstånd i lot
bord.
För att undantagsbegränsningen ska fungera behöver du tilläggsmodulen btree_gist . Detaljerade instruktioner:
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))
);
-
Använda en datatyp för tidsstämpelintervall
tsrange
för parkeringstidenduring
.Ange med övre gränsen NULL, när bilen kommer in. Uppdatera med övre gräns när bilen går ut. Detta gör det bland annat också möjligt för bilar att parkera flera dagar. -
Några ytterligare
CHECK
begränsningar för att tillämpa grundläggande regler påduring
:- Inklusive nedre gräns, exklusiv övre gräns för att förbli konsekvent.
- Den nedre gränsen (ingången) kan aldrig saknas.
Relaterat: