2012-12-22 18 views
7

私はテーブルを持っています。トランザクションでは、1つのトランザクションに対して2つのレコードを保存します.1つは借方記入とその他のクレジット用です。相互に排他的なテーブル列を作成する方法

したがって、テーブルcreditAmount(Money)debitAmount(Money)に2つの列があります。

各行で列のいずれかがヌルでないというテーブルレベルの制約が必要です。 つまり、行番号3 creditAmountがNULLの場合、debitAmountには値とVice Versaを保持する必要があります。

レコードを行内に挿入するときに同じ方法を保証する方法はありますか?

+4

「C」または「D」を示す1つの列とフラグはありません。 –

+1

好奇心が強いですが、クレジットやデビットを示すのに適切な単一の値の符号がないのはなぜですか? – HABO

+0

それは必要条件です、私はそれを変更できません。 – MaxRecursion

答えて

13

あなたは、テーブルにCHECK constraintを追加することができます。

ALTER TABLE Transactions ADD CONSTRAINT CK_Transactions_DebitOrCreditExists 
CHECK ((creditAmount IS NULL AND debitAmount IS NOT NULL) 
    OR (creditAmount IS NOT NULL AND debitAmount IS NULL)) 
+0

更新されました。マーティンありがとう! –

0

あなたはフロントエンド(アプリケーション)を介して処理している場合は、クレジットカードやデビットというヌルの両方の問題は発生しません。デビットまたはクレジットのいずれかに、少なくとも1つのエントリが挿入されます。

誰かがバックエンド経由で処理していて、テーブルに値を直接挿入しているときに制約をかけたいと思うでしょう。その場合、Chrisは解決策を提案しました。

バックエンドから挿入する場合でも、私はデビットでもクレジットでもないトランザクションを記録する理由はありません。

+0

実際にそのサービスとサービスデベロッパーとして、私に送られたデータに完全に依存しません。ですから、予防策のためです。 – MaxRecursion

+0

すべてのレベルでデータを検証することができます。 C.f。誰かが手動でデータベースにデータを入力し、フロントエンドまたは実際のビジネス層の検証ロジックをバイパスしている場合。 – 5arx

関連する問題