2013-08-09 8 views
8

私は4つの列(ID(PK、int、NOT NULL)、col1(NULL)、col2(NULL)、col3(NULL))を持つテーブルを持っていますCHECK制約は他の場合と同様に動作しますか?

IDはCHECK制約私は思う)よう:?COL3はその後、col1のNOT NULLであるとcol2、すなわちcol3という

NULLでなければならない場合はcol1とcol2にはnullではないか、またはその逆

場合はnullでなければなりません

if col1 OR col2 are NOT NULL then col3 must be NULL 

私は非常にSQLとSQLサーバーの新しいですどのように実際にこれを実装するか、実装できるかどうかはわかりません。

CHECK ((col1 NOT NULL OR col2 NOT NULL AND col3 NULL) OR 
     (col3 NOT NULL AND col1 NULL AND col2 NULL)) 

しかし、ブラケットは、このようにグループにロジックを使用することができます場合、私はわからない:

私は多分ないでしょうか?

もしそうでなければ、これはどのようにして実装できますか?

+0

いいえ、私のテーブルは他のたくさんのライブサーバー上にある、あなたのテーブルに次のチェックステートメントを追加しますと言うでしょう作業用のものを使用しているので、物事をねじにしたくない: – Toby

+2

同等の開発環境はありませんか? – Yuck

+0

いいえ、ここでどちらかを設定する方法はありません。そうでなければ私はどのように開始したのでしょうか(また、私は非常に新しいSQLを指していて、SQLサーバまたはDBを最初から設定する場所はわかりません) – Toby

答えて

11

これは絶対できます。このsqlfiddleを参照してください。

ただし、ロジックを正しくブラケットにする必要があります。 決してと同じブラケットスコープ内のANDとORを混ぜる必要があります。だから、:

((col1 NOT NULL OR col2 NOT NULL) AND col3 NULL) 

または::

(col1 NOT NULL OR (col2 NOT NULL AND col3 NULL)) 

あなたの目的に応じ

(col1 NOT NULL OR col2 NOT NULL AND col3 NULL) 

はなっている必要があります。

+0

ありがとう - また、sqfiddleを示してくれてありがとう、存在していない、非常に便利だろう:) – Toby

+0

それは両方の条件のためにチェックするでしょうか? – Dhaval

+0

@Dhaval:ロジックは単純に '((col1 NOT NULLとcol2 NOT NULLとcol3 NULL)OR(col3 NOT NULLとcol1 NULLとcol2 NULL))'であることを指摘することを意味します。この問題は、 'col1'と' col2'が常に同じ状態を持つように強制することです。私は意図的にOPがこれをしなかったと思います。なぜなら、col1またはcol2のいずれかがNOT NULLであれば、col3はNULLでなければならないからです。 – PinnyM

3

ブラケットで間違えないように注意してください。

CREATE TABLE Test1 (col1 INT, col2 INT, col3 INT); 


ALTER TABLE Test1 
ADD CONSTRAINT CHK1 
CHECK (((col1 IS NOT NULL OR col2 IS NOT NULL) AND col3 IS NULL) OR 
     ((col1 IS NULL AND col2 IS NULL) AND col3 IS NOT NULL)) 



INSERT INTO Test1 VALUES (1,1,1); --fail 
INSERT INTO Test1 VALUES (1,1,NULL); --good 
INSERT INTO Test1 VALUES (1,NULL,NULL); --good 
INSERT INTO Test1 VALUES (1,NULL,1); --fail 
INSERT INTO Test1 VALUES (NULL,NULL,1); --good 
1

私は

以下
create FUNCTION dbo.fn_check_val 
    (@col1 int , @col2 int , @col3 int) 
RETURNS bit 
AS 
BEGIN 
    declare @toRet bit 
    IF(@col1 is Not null OR @col2 is NOT NULL) 
    Begin 
     if(@col3 is null) 
     Begin 
      Set @toRet = 1 
     End 
     Else 
     Begin 
      Set @toRet = 0 
     End 
    End 
    Else 
    if(@col3 is not null) 
    Begin 
     Set @toRet = 1 
    End 
    Else 
    Begin 
     Set @toRet = 0 
    End 
return @toRet 
END 

のようなUDFを作成し、

([dbo].[fn_check_val]([col1],[col2],[col3])=(1)) 
+0

うわー、 !これを行うのが簡単なAND/OR制約よりも優れている理由を説明できますか? – Toby

+1

@Toby ..あなたは正しいです...私はこれを行うことができることを説明しようとしました – Dhaval

関連する問題