Rozwiązanie na to, o co prosisz
Zakładając, że chcesz to wymusić:
"Id_Lot"
faktycznie istnieje w"Lot"."Code"
. -> Ograniczenie FK"Lot"."Empty"
dla spotu jestTRUE
tylko w momencie sprawdzania.
możesz zrób to za pomocą NOT VALID
CHECK
ograniczenie za pomocą fałszywego IMMUTABLE
funkcja do sprawdzenia na drugim stole. Szczegóły:
Ale Twój model danych jest niepewny pod wieloma względami. Sugerowałbym znacznie czystsze podejście.
Czystszy projekt z ograniczeniem wykluczenia
Nie przechowuj, czy dana parcela jest obecnie pusta z nadmiarem. To bardzo podatne na błędy i podatne na problemy ze współbieżnością. Egzekwuj, że każda partia może być pobierana tylko raz naraz za pomocą ograniczenie wykluczenia
. Aby to zadziałało, zapisz czas wyjścia w ticket
, dodatkowo.
CREATE TABLE lot (
lot_id varchar(4) NOT NULL PRIMARY KEY -- I would use integer if possible
, lot_type text NOT NULL
);
Brak nadmiarowego aktualnego stanu w lot
tabela.
Aby ograniczenie wykluczenia działało, potrzebujesz dodatkowego modułu btree_gist . Szczegółowe instrukcje:
- Problem z integralnością relacji „jeden do wielu” dla zakresów czasowych
- Przechowuj dzień tygodnia i godzinę?
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))
);
-
Korzystanie z typu danych zakresu sygnatury czasowej
tsrange
na czas parkowaniaduring
.Wpisz z górną granicą NULL, gdy samochód wjedzie. Zaktualizuj górną granicę, gdy samochód wyjedzie.Umożliwia to między innymi parkowanie samochodów przez wiele dni. -
Niektóre dodatkowe
CHECK
ograniczenia wymuszające podstawowe zasady naduring
:- Inkluzywna dolna granica, wyłączna górna granica, aby zachować spójność.
- Dolna granica (wejście) nigdy nie może zostać pominięta.
Powiązane: