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

Contrainte de vérification Oracle

Bien que je n'aie pas Oracle, j'ai fait un test rapide avec PostgreSQL et votre premier exemple (IS_DISABLED étant NULL et DISABILITY_INCOME_TYPE_ID étant 1):

postgres=> select (null is null and 1 is null);
 ?column?
----------
 f
(1 registro)

postgres=> select (null is null and 1 is null) or (null = 0 and 1 is null);
 ?column?
----------
 f
(1 registro)

postgres=> select (null is null and 1 is null) or (null = 0 and 1 is null) or (null = 1);
 ?column?
----------

(1 registro)

Ici, nous voyons clairement que, dans ce cas, votre expression (au moins sur PostgreSQL) renvoie NULL. Depuis le manuel ,

Donc, si Oracle se comporte de la même manière que PostgreSQL, la contrainte de vérification passe .

Pour voir si c'est le cas, évitez les manigances NULL en le vérifiant explicitement et voyez si cela fonctionne :

CHECK ((IS_DISABLED IS NULL AND DISABILITY_INCOME_TYPE_ID IS NULL)
    OR (IS_DISABLED IS NOT NULL AND IS_DISABLED = 0 AND DISABILITY_INCOME_TYPE_ID IS NULL)
    OR (IS_DISABLED IS NOT NULL AND IS_DISABLED = 1));