2012-12-22 19 views
7

Ich habe eine Tabelle Transaktionen, in denen ich zwei Datensätze für eine Transaktion speichern, eine für die Belastung und andere Kreditierung.So erstellen Sie sich gegenseitig ausschließende Tabellenspalten

Also habe ich zwei Spalten in Tabelle creditAmount(Money) und .

Ich möchte eine Einschränkung auf Tabellenebene, dass eine der Spalten in jeder Zeile nicht null ist. , d. H. Wenn Zeile # 3 creditAmount Null ist, dann muss debitAmount einen gewissen Wert und Vice Versa halten.

Wie kann ich das gleiche beim Einfügen eines Datensatzes in einer Zeile sicherstellen?

+4

Warum nicht eine Spalte und ein Flag, das "C" oder "D" anzeigt? –

+1

Nur neugierig, aber warum ist das Zeichen eines einzigen Wertes nicht ausreichend, um Kredit oder Debit anzuzeigen? – HABO

+0

Das ist die Voraussetzung, ich kann es nicht ändern. – MaxRecursion

Antwort

13

Sie können eine CHECK constraint der Tabelle hinzufügen:

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

Aktualisiert. Danke Martin! –

0

Wenn Sie über Front-end (Anwendung) sind Handling, dann ist die Ausgabe sowohl von Kredit- und ist null Debit nicht entstehen. Mindestens ein Eintrag wird entweder in Soll oder Haben eingefügt.

Ich denke, Sie möchten eine Einschränkung setzen, wenn jemand über Back-End behandelt und direkt Werte in eine Tabelle einfügt. In diesem Fall schlug Chris eine Lösung vor.

Aber selbst wenn Sie vom Back-End einfügen, ich folge nicht, warum ich eine Transaktion aufzeichnen würde, wenn es weder Lastschrift noch Kredit ist.

+0

Eigentlich ist es ein Service und als Service-Entwickler kann ich mich nicht vollständig auf Daten verlassen, die an mich gesendet werden. Also, es ist nur vorsichtshalber. – MaxRecursion

+0

Es ist gut, Ihre Daten auf allen Ebenen zu validieren. C.f. Der Fall, in dem jemand Daten manuell in die Datenbank eingibt und eine Front-End- oder Business-Schicht-Validierungslogik umgeht. – 5arx

Verwandte Themen