web-dev-qa-db-ja.com

2つのフィールドのうち1つだけを入力する必要があるような制約を作成します。

SQLサーバーに、ユーザーが2つの列のいずれかにデータを入力する必要があるテーブルがあります。つまり、2つのうち1つはデータを入力する必要がありますが、同時にユーザーが両方の列に入力できるようにしたくありません。それはどちらかですが、1つは必須です。

9
Kevin

チェック制約を使用する必要があります:

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

このような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)); 
2
sepupic

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
)
1
John Rees