2017-08-04 3 views
0

J'utilise Oracle SQL Developer.Ajout de contraintes liées à la date sur des colonnes de table avec des conditions spécifiques

est en dessous du tableau ci-dessous, j'ai créé:

CREATE Screening_Plan 
(
plan_id NUMBER (4) PRIMARY KEY, 
movie_id NUMBER (4) NOT NULL, 
plan_start_date DATE NOT NULL, 
plan_end_date DATE NOT NULL, 
plan_min_start_hh24 NUMBER (2) NOT NULL, 
plan_max_start_hh24 NUMBER (2) NOT NULL, 
plan_no_of_screenings NUMBER (2) NOT NULL 
); 

Pour la colonne plan_start_date, comment ajouter une contrainte par défaut: lundi prochain?

Pour la colonne plan_end_date, comment ajouter une contrainte à la valeur par défaut: lundi prochain + 6 (jours)? Pour la colonne plan_min_start_hh24, comment ajouter une contrainte pour conserver la valeur entre 9 (9:00) et 22 (22:00) et définir la valeur par défaut sur 9? Pour la colonne plan_max_start_hh24, comment ajouter une contrainte pour conserver la valeur entre 9 (9h00) et 22 (22h00) et définir la valeur par défaut sur 22 et définir supérieur ou égal à plan_min_start_hh24?

+0

Y at-il une raison pour laquelle vous souhaitez ajouter ces règles comme des contraintes au niveau de la table? Dans mon expérience, ce type de logique est codé au niveau de la couche d'application –

+0

Je voulais tester et voir comment les contraintes fonctionnent au niveau de la table juste pour la connaissance. – stranger

+1

Voulez-vous affecter une valeur DEFAULT à une colonne à affecter à cette colonne si une instruction INSERT omet une valeur pour cette colonne? Ou vous voulez définir une contrainte d'intégrité, c'est-à-dire une règle qui interdit de stocker dans la colonne les valeurs qui ne remplissent pas les conditions définies? Il y a deux choses distinctes - DEFAULT et CONTRAINTES. Dans ce dernier cas, une contrainte telle que «date de début doit être NEXT LUNDI» n'a pas de sens. – krokodilko

Répondre

0

Les contraintes dans Oracle ne peuvent pas référencer quoi que ce soit de non déterministe, c'est-à-dire une expression dont le résultat peut changer/changer au fil du temps. Cela signifie que vous ne pouvez pas utiliser une contrainte pour appliquer des éléments tels que "lundi prochain". En général, les contraintes doivent être vraies ou fausses indépendamment du moment où elles sont évaluées. Voir Restrictions on Check Constraints.

Cela pourrait toutefois être fait en tant que déclencheur sur cette table.

En ce qui concerne les autres contraintes, quelque chose comme cela devrait fonctionner:

alter table Screening_Plan add constraint Screening_Plan_ck1 check (
    plan_min_start_hh24 between 9 and 22 
); 

alter table Screening_Plan modify(plan_min_start_hh24 number(2) not null default 9);