2012-12-22 71 views
7

我有一個表我正在爲一個交易保存兩個記錄的交易,一個用於借記和其他貸記。如何創建互斥的表列

所以我有兩列在表creditAmount(Money)debitAmount(Money)

我想要一個表級約束,該列中的任何一個在每一行中都不爲空。 即,如果行#3 creditAmount爲空,那麼debitAmount必須保持某個值和副Versa。

如何確保在連續插入記錄時相同?

+4

爲什麼不是一列和一個標誌指示'C'或'D'? –

+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

如果通過前端(應用程序)的處理,則不會出現這兩種信用卡和借記是空的問題。插入至少一個條目,無論是借記還是貸記。

我想你想在某人正在通過後端處理並直接在表中插入值時施加約束。那樣的話,克里斯提出了一個解決方案。

但是,即使您從後端插入,我也不會遵循爲什麼在既不是借方也不是信用卡時記錄交易。

+0

其實它的服務和作爲服務開發我不能完全依靠發送給我的數據。所以,它只是爲了防範。 – MaxRecursion

+0

它很好地驗證您的數據在各個層面。 C.F.在這種情況下,某人正在將數據手動輸入數據庫,並繞過任何前端或事實上的業務層驗證邏輯。 – 5arx