PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Comment définir cette contrainte ?

Solution pour ce que vous demandez

En supposant que vous vouliez appliquer cela :

  1. "Id_Lot" existe réellement dans "Lot"."Code" . -> Contrainte FK
  2. "Lot"."Empty" pour le spot est TRUE 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 :

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 stationnement during .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 sur during :

Connexe :