2012-12-22 11 views
7

Mam tabelę Transakcje, w których zapisuję dwa rekordy dla jednej transakcji, jedną dla obciążenia i inne kredyty.Tworzenie wzajemnie wykluczających się kolumn tabeli

Więc mam dwie kolumny w tabeli creditAmount(Money) i debitAmount(Money).

Chcę ograniczenia poziomu tabeli, że jedna kolumna nie jest pusta w każdym wierszu. tj. Jeśli wiersz nr 3 creditAmount ma wartość null, to debitAmount musi mieć pewną wartość i Vice Versa.

Jak zapewnić to samo podczas wstawiania rekordu z rzędu?

+4

Dlaczego nie jedna kolumna i flaga wskazująca "C" lub "D"? –

+1

Po prostu ciekawy, ale dlaczego nie jest znakiem jednej wartości wystarczającej do wskazania kredytu lub debetu? – HABO

+0

To wymóg, nie mogę go zmienić. – MaxRecursion

Odpowiedz

13

Możesz dodać CHECK constraint do stołu:

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

Zaktualizowano. Dziękuję Martin! –

0

Jeśli obsługa poprzez przedni koniec (twój wniosku), to problem zarówno kredytowych i debetowych pod rygorem nie pojawią. Wstawiony jest co najmniej jeden wpis w polu debetowym lub kredytowym.

Zgaduję, że chcesz umieścić ograniczenie, gdy ktoś obsługuje za pośrednictwem zaplecza i bezpośrednio wstawia wartości w tabeli. W takim przypadku Chris zasugerował rozwiązanie.

Ale nawet jeśli wstawiasz z zaplecza, nie śledzę, dlaczego zapisałbym transakcję, gdy nie jest to Debet ani Kredyt.

+0

W rzeczywistości jest to usługa i usługa, ponieważ nie mogę całkowicie polegać na przesłanych do mnie danych. Tak, to tylko dla ostrożności. – MaxRecursion

+0

Dobrze jest sprawdzić dane na wszystkich poziomach. C.f. przypadek, gdy ktoś ręcznie wprowadza dane do bazy danych i omija każdą logikę walidacji front-end lub w rzeczywistości biznesową. – 5arx

Powiązane problemy