SQLサーバーに、ユーザーが2つの列のいずれかにデータを入力する必要があるテーブルがあります。つまり、2つのうち1つはデータを入力する必要がありますが、同時にユーザーが両方の列に入力できるようにしたくありません。それはどちらかですが、1つは必須です。
チェック制約を使用する必要があります:
_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) )
);
_
これにより、少なくとも列の1つに値があり、両方に値があるわけではありません。
それらがvarchar
列である場合は、空の値(_''
_)も確認する必要があります。これを行うには、関数の2番目の引数と等しい場合に値をnull
に変換するnullif()
を使用します。
_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) )
);
_
このようなSmth?
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));
3つ以上の列に拡張するアプローチは、null以外の列の数が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
)