Solution pour ce que vous demandez
En supposant que vous vouliez appliquer cela :
"Id_Lot"
existe réellement dans"Lot"."Code"
. -> Contrainte FK"Lot"."Empty"
pour le spot estTRUE
au moment du contrôle uniquement.
Vous pourriez faites cela avec un NOT VALID
CHECK
contrainte utilisant un faux IMMUTABLE
fonction à vérifier sur l'autre table. Détails :
Mais votre modèle de données est fragile à plusieurs égards. Je suggérerais une approche beaucoup plus propre.
Conception plus propre avec contrainte d'exclusion
Ne stockez pas si un lot est actuellement vide de manière redondante avec le lot. C'est très sujet aux erreurs et sensible aux problèmes de concurrence. Faites en sorte que chaque lot ne puisse être pris qu'une seule fois à la fois avec un contrainte d'exclusion
. Pour que cela fonctionne, enregistrez l'heure de sortie dans ticket
, en plus.
CREATE TABLE lot (
lot_id varchar(4) NOT NULL PRIMARY KEY -- I would use integer if possible
, lot_type text NOT NULL
);
Aucun état actuel redondant dans le lot
tableau.
Pour que la contrainte d'exclusion fonctionne, vous avez besoin du module supplémentaire btree_gist . Instructions détaillées :
- problème d'intégrité de la relation "un-à-plusieurs" pour les plages de temps
- Stocker le jour de la semaine et heure ?
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))
);
-
Utilisation d'un type de données de plage d'horodatage
tsrange
pour la durée de stationnementduring
.Entrez avec la limite supérieure NULL, lorsque la voiture entre. Mise à jour avec limite supérieure lorsque la voiture sort. Entre autres choses, cela permet également aux voitures de se garer plusieurs jours. -
Quelques
CHECK
supplémentaires contraintes pour appliquer les règles de base surduring
:- Limite inférieure inclusive, limite supérieure exclusive pour rester cohérent.
- La limite inférieure (entrée) ne peut jamais manquer.
Connexe :