Решение за това, което искате
Ако приемем, че искате да наложите това:
"Id_Lot"
всъщност съществува в"Lot"."Code"
. -> FK ограничение"Lot"."Empty"
за мястото еTRUE
само по време на проверката.
Вие можете направете това с NOT VALID
CHECK
ограничение с помощта на фалшив IMMUTABLE
функция за проверка на другата маса. Подробности:
Но вашият модел на данни е нестабилен в редица аспекти. Бих предложил много по-чист подход.
По-чист дизайн с ограничение за изключване
Не съхранявайте дали партидата в момента е празна излишно с партидата. Това е много податливо на грешки и е податливо на проблеми с паралелността. Наложете, че всяка партида може да бъде взета само веднъж наведнъж с ограничение за изключване
. За да работи това, запазете часа на излизане в ticket
, допълнително.
CREATE TABLE lot (
lot_id varchar(4) NOT NULL PRIMARY KEY -- I would use integer if possible
, lot_type text NOT NULL
);
Няма излишно текущо състояние в lot
таблица.
За да работи ограничението за изключване, имате нужда от допълнителния модул 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))
);
-
Използване на тип данни за диапазон от дата и време
tsrange
за продължителността на паркиранеduring
.Въведете с горна граница NULL, когато колата влезе. Актуализирайте с горна граница, когато колата излезе. Наред с други неща, това също така прави възможно автомобилите да паркират няколко дни. -
Някои допълнителни
CHECK
ограничения за налагане на основни правила заduring
:- Включваща долна граница, изключителна горна граница, за да остане последователна.
- Долната граница (вход) никога не може да липсва.
Свързани: