VÉRIFICATION de la contrainte dans oracle pour vérifier une valeur entre les colonnes
J'ai une table appelée Room
et il a des colonnes (ID, type, prix, etc...)
Je veux ajouter des contraintes pour les deux type
et price
comme:
- si simple (s), alors le prix ne doit pas être supérieur à 50,
- si double (d), alors le prix ne doit pas être supérieure à 100, et
- si la famille (f), puis le prix ne doit pas être supérieure à 150
J'ai essayé de l'ajouter comme ça, mais il me fait une erreur. Pas sûr de savoir comment dois-je écrire ceci:
ALTER TABLE ROOM
ADD (CONSTRAINT CHK_PRICE CHECK (
(TYPE='S' AND PRICE <= 50) AND
(TYPE='D' AND PRICE <=100) AND
(TYPE='F' AND PRICE <= 150)));
L'erreur renvoyée est:
SQL Error: ORA-02293: cannot validate (xxxx.CHK_PRICE) - check
constraint violated
02293. 00000 - "cannot validate (%s.%s) - check constraint violated"
*Cause: an alter table operation tried to validate a check constraint to
populated table that had nocomplying values.
*Action: Obvious
nop....tous les prix sont en dessous de leur valeur requise
comment le savez-vous? L'erreur dit clairement que
comment le savez-vous? L'erreur dit clairement que
*Cause: an alter table operation tried to validate a check constraint to populated table that had nocomplying values.
!!OriginalL'auteur user1672735 | 2012-09-15
Vous devez vous connecter pour publier un commentaire.
Il semble que vous devez
OR
ensemble les trois conditions, pasAND
ensemble. Il est impossible de n'importe quelle ligne pour satisfaire aux trois critères -type
ne peut à la fois avoir une valeur de S, D et F. Vous voulez probablementTYPE
et/ouPRICE
sont nulles. Par exemple, la modification de contrainte comme la publication, sur son propre, elle n'empêche pas des lignes d'être inséré siTYPE
ouPRICE
est null, ce qui peut ne pas être ce qui est prévu.oui, l'ajout ou la ne fonctionne....merci!
OriginalL'auteur Justin Cave
Bien, vous avez besoin d'utiliser "ou" au lieu de "et" dans les trois conditions de contrôle.
Et message d'erreur (ORA-02293: ne peut pas valider) informe qu'il y a certaines lignes de données dans votre table de salle à violer votre contrainte d'intégrité. En outre, vous pouvez spécifier si les données existantes dans la table doit se conformer afin d'être contrainte ou non avec la possibilité de VALIDER ou de NOVALIDATE.
si vous ne voulez pas le faire valider ces lignes de données dans la chambre, vous pouvez spécifier cette contrainte NOVALIDATE, et de VALIDER le comportement par défaut.
OriginalL'auteur dylanninin
Vous obtenez le message d'erreur ORA-02293 parce que vous avez déjà données dans votre tableau qui ne satisfont pas votre nouvellement créé vérification de la contrainte.
Je pense qu'une partie importante ici, c'est de réaliser que vous n'avez pas une règle d'entreprise pour valider ici, mais trois. Et il serait plus pratique pour l'utilisateur qui valide la contrainte, de savoir EXACTEMENT quel est le problème avec la ligne qu'il est de l'insérer. C'est pour ça que j'irais pour ces contraintes:
Ce qui concerne,
Rob.
PS: Plus d'informations sur ce sujet peuvent être trouvées dans cet article sur le blog de la mine.
OriginalL'auteur Rob van Wijk