2009-12-02 3 views
10

blague avec un collègue, je suis venu avec un scénario intéressant: Est-il possible dans SQL Server de définir une table de sorte que par "moyens standard" (contraintes, etc.) je peux s'assurer que deux colonnes ou plus s'excluent mutuellement? Je veux dire par là: Est-ce que je peux m'assurer qu'une seule colonne contient une valeur?SQL-Server: Définir des colonnes comme mutuellement exclusives

+0

Quel problème tentez-vous de résoudre? bases de données subnormales sont un PITA à travailler avec, peut-être vous pouvez le faire d'une manière qui ne sacrifie pas les goodies relationnels. –

+0

Eh bien, il n'y a pas vraiment de problème derrière cette idée. Je voulais juste savoir s'il est techniquement possible de le faire. Une idée pourrait être l'exigence qu'un utilisateur peut soit entrer son propre nom ou le nom de l'entreprise, mais pas les deux. Je pense que je pourrais penser à quelque chose de mieux :-) –

Répondre

14

Oui, vous pouvez, en utilisant une contrainte CHECK:

ALTER TABLE YourTable 
ADD CONSTRAINT ConstraintName CHECK (col1 is null or col2 is null) 

par votre commentaire, si plusieurs colonnes sont exclusives, vous pouvez les vérifier comme ceci:

case when col1 is null then 0 else 1 end + 
case when col2 is null then 0 else 1 end + 
case when col3 is null then 0 else 1 end + 
case when col4 is null then 0 else 1 end 
= 1 

Cela dit que l'un des quatre colonnes doivent contenir une valeur. Si elles peuvent toutes être NULL, vérifiez simplement <= 1.

+0

Ah oui, je peux voir où ça va. Cependant, la vérification serait beaucoup plus complexe si j'avais trois colonnes ou plus, car je devrais ajouter toutes les combinaisons possibles, n'est-ce pas? –

+0

@Thorsten Dittmar: Il devient un peu plus complexe avec plusieurs colonnes, je pense que vous pouvez le faire sans ajouter toutes les combinaisons possibles, répondre édité – Andomar

+0

Salut exigences correspond exactement à la même situation décrite ci-dessus, mais aussi col1 et col2 ne devraient pas être nul en même temps, seulement l'un d'eux doit toujours être peuplé .. Comment assurer cela? – MaxRecursion

Questions connexes