web-dev-qa-db-fra.com

Créer une contrainte de telle sorte qu'un seul des deux champs doit être rempli

J'ai une table dans SQL Server où les utilisateurs doivent entrer des données dans l'une des deux colonnes. Autrement dit, l'un des deux doit avoir des données entrées, mais en même temps, je ne veux pas autoriser les utilisateurs à entrer dans les deux colonnes. C'est soit ou mais l'un est un must.

9
Kevin

Vous devez utiliser une contrainte de vérification:

create table kevin
(
  one   integer, 
  other integer,
  constraint only_one_value 
        check (        (one is null or other is null) 
               and not (one is null and other is null) )
);

Cela garantit que au moins l'une des colonnes a une valeur et que les deux n'ont pas de valeur.

S'il s'agit de colonnes varchar, vous pouvez également vérifier les valeurs vides (''). Pour ce faire, utilisez nullif() qui convertit une valeur en null si elle est égale au deuxième argument de la fonction.

create table kevin
(
  one   integer, 
  other integer,
  constraint only_one_value 
        check (        (nullif(one,'') is null or nullif(other,'') is null) 
               and not (nullif(one,'') is null and nullif(other,'') is null) )
);
12

Comme ça?

create table #t (col1 int, col2 int)
go

alter table #t with check add 
   constraint ck_only_one check ((col1 is null and col2 is not null) or (col2 is null and col1 is not null)); 
2
sepupic

Une approche qui évolue mieux sur plus de 2 colonnes consiste à vérifier que le nombre de colonnes non nulles est 1.

create table #t (col1 int, col2 int, col3 int)
go

alter table #t with check add constraint ck_only_one check (
    1 = 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
)
1
John Rees