web-dev-qa-db-ja.com

複数の列でCONSTRAINTをチェックする

SQL Server 2008を使用しています

同じテーブルの複数の列でCHECK CONSTRAINTを使用して、データ入力の検証を試みます。

エラーが表示されます:

列 'AAAA'の列CHECK制約は、別の列、テーブル 'XXXX'を参照しています。

CHECK CONSTRAINTはこの方法では機能しません。

FKを使用せずにこれを単一のテーブルに実装する他の方法はありますか?

ありがとう

ここに私のコードの例

CREATE TABLE dbo.Test 
(   
EffectiveStartDate  dateTime2(2)        NOT NULL,
EffectiveEndDate    dateTime2(2)        NOT NULL
    CONSTRAINT CK_CmsSponsoredContents_EffectiveEndDate CHECK (EffectiveEndDate > EffectiveStartDate),
);
22
GibboK

はい、CHECK CONSTRAINTをtableレベルで定義します

CREATE TABLE foo (
   bar int NOT NULL, 
   fred varchar(50) NOT NULL,

   CONSTRAINT CK_foo_stuff CHECK (bar = 1 AND fred ='fish')
)

インラインでcolumn制約として宣言しています

...
fred varchar(50) NOT NULL CONSTRAINT CK_foo_fred CHECK (...)
...

編集する、説明するより投稿するのが簡単。コンマを修正しました。

CREATE TABLE dbo.Test 
(   
  EffectiveStartDate  dateTime2(2)        NOT NULL,
  EffectiveEndDate    dateTime2(2)        NOT NULL,  --need comma
  CONSTRAINT CK_CmsSponsoredContents_EffectiveEndDate CHECK (EffectiveEndDate > EffectiveStartDate) --no comma
);

もちろん、問題はFK制約であるはずのCHECK制約を使用していますか?

47
gbn

チェック制約は、単一の列またはレコード全体を参照できます。

次の構文をレコードレベルの制約に使用します。

ALTER TABLE MyTable
ADD CONSTRAINT MyCheck
CHECK (...your check expression...)
2
devio

特に、チェックが失敗した場合に操作がロールバックされるように、テーブルのトリガーに検証を適用するだけです。

1