Oracle
 sql >> Database >  >> RDS >> Oracle

Vincolo di controllo Oracle

Anche se non ho Oracle, ho fatto un rapido test con PostgreSQL e il tuo primo esempio (IS_DISABLED essendo NULL e DISABILITY_INCOME_TYPE_ID essendo 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)

Qui vediamo chiaramente che, in questo caso, la tua espressione (almeno su PostgreSQL) restituisce NULL. Da il manuale ,

Quindi, se Oracle si comporta come PostgreSQL, il vincolo check supera .

Per vedere se questo è il caso, evita gli shenanigan NULL controllandolo esplicitamente e verifica se funziona:

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));