2017-04-05 2 views
1

J'ai cette question autour de contraintes SQL, afin d'obtenir un comportement suivant:SQL Constraint conditionnelle Vérifiez: si column0 est nul, colonne1 n'est pas nul et vice versa

tableA a deux colonnes Column0 et Column1, qui ne on peut être nULL sur la saisie des données: par exemple: si column0 est nul, colonne1 ne peut pas être nulle si colonne1 est nul, column0 ne peut pas être nulle

Pour ce faire, j'ai construire des contraintes suivantes SQL :

CONSTRAINT column01_not_null_chk 
CHECK (
    (column0 IS NOT NULL 
    AND column1 IS NULL) 
OR 
    (column1 IS NOT NULL 
    AND column0 IS NULL)) 

est-ce correct d'accomplir mon comportement? Parce que tous SQL sont rejetés en raison de cette contrainte

+0

Quelle est SGBDR cela? Veuillez ajouter une balise pour spécifier si vous utilisez 'mysql',' postgresql', 'sql-server',' oracle' ou 'db2' - ou autre chose entièrement. –

+1

Cela ne vérifie pas seulement de ne pas avoir deux zéros, cela force à en avoir un et un seul nul. – iguypouf

+0

@marc_s utilisant postgresql désolé – shabang

Répondre

3

La condition que vous décrit signifie qu'au moins l'un d'entre eux doit avoir une valeur. Donc, votre contrainte doit être corrigée:

CONSTRAINT column01_not_null_chk 
CHECK (column0 IS NOT NULL OR column1 IS NOT NULL) 
+0

Bonne prise! La question n'a pas dit que deux valeurs non nulles devraient échouer. – SqlZim

+0

@Zack quel stupide je suis! J'aurais dû simplifier ma logique, de cette façon. Est-ce mieux pour la lecture! THX – shabang

1

semble fonctionner correctement sur SQL Server:

create table t (
    column0 int null 
    , column1 int null 
, CONSTRAINT column01_not_null_chk 
CHECK (
    (column0 IS NOT NULL 
    AND column1 IS NULL) 
OR 
    (column1 IS NOT NULL 
    AND column0 IS NULL)) 
); 

insert into t values (null,1),(1,null); 

select * from t; 
--insert into t values (null,null) /* fail */ 
--insert into t values (1,1) /* fail */ 

rextester démonstration: http://rextester.com/OQZNE39497

retours:

+---------+---------+ 
| column0 | column1 | 
+---------+---------+ 
| NULL | 1  | 
| 1  | NULL | 
+---------+---------+ 
+0

Merci d'avoir mentionné l'outil rextester @SqlZim, j'avais d'autres problèmes résultant de l'échec – shabang