2009-07-17 18 views
3

支払いを保存するテーブルがあり、支払い方法がクレジットカードであることを確認したい場合は、カードタイプフィールドをIN( 'Visa'、 'MasterCard'、 'Discover'、 'American Express ')、支払い方法がクレジットカードでない場合、カードタイプフィールドはNULLにする必要があります。SQL Serverチェック制約の照会

は、チェック制約ウィル私はこのようなステートメントを使用することができます:

(method = 'CC' AND cardType IN ('Visa', 'MasterCard', 'Discover', 'American Express')) 
OR 
(method != 'CC' AND cardType = NULL) 

制約は多分のみ1つのフィールド(わからない)を確認するために使用されなければならないので、私はこの1つを完全にオフベースであるかもしれません。

また、このようなステートメントが許可されていると、パフォーマンスが低下する可能性がありますか?

編集:私は最終的にCARDTYPEフィールドの作成に関する計画し、外部キーとして私達の支払テーブルにCARDTYPEを持っている...これはちょうど私がその間に

答えて

3

なぜだけではなく、外部キーをやってと思っていますものです別のテーブルとnullを許可するには?

カードタイプのコードを別のテーブルに作成して、それにキーを格納することもできます。

+0

+1 - 参照するCardTypeテーブルを使用して構造を明確に正規化します。例えば標準化されたアプローチの場合、50,000バイトを超える場合と比較して、現在のスキーマで800,000バイトである「American Express」で50,000回の支払いが行われます。 – AdaTheDev

+0

このルートに進む予定です。これは私が作業している既存の構造で、新しいカードタイプテーブルを作成して、チェック制約を使用することを考えていた既存のレコードを更新するまでです。 –

+0

マッピングのような別のテーブルではなく、アプリケーションのenum値。 – Shimmy