2012-12-22 39 views
7

Tôi có bảng Giao dịch nơi tôi đang lưu hai bản ghi cho một giao dịch, một cho ghi nợ và ghi có khác.Cách tạo cột bảng loại trừ lẫn nhau

Vì vậy, tôi có hai cột trong bảng creditAmount(Money)debitAmount(Money).

Tôi muốn ràng buộc mức bảng mà một trong hai cột không phải là rỗng trong mỗi hàng. tức là nếu hàng # 3 creditAmount là không thì debitAmount phải giữ một số giá trị và ngược lại.

Làm thế nào để đảm bảo giống nhau khi chèn một bản ghi liên tiếp?

+4

Tại sao không có một cột và cờ chỉ ra 'C' hoặc' D'? –

+1

Chỉ cần tò mò, nhưng tại sao không phải là dấu hiệu của một giá trị duy nhất đủ để chỉ ra tín dụng hoặc ghi nợ? – HABO

+0

Đó là yêu cầu, tôi không thể thay đổi nó. – MaxRecursion

Trả lời

13

Bạn có thể thêm một CHECK constraint để bàn:

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

Đã cập nhật. Cảm ơn Martin! –

0

Nếu bạn đang xử lý qua Front-end (ứng dụng của bạn), thì vấn đề của cả hai Credit và Debit là null sẽ không nảy sinh. Ít nhất một mục nhập được chèn vào trong Ghi nợ hoặc Tín dụng.

Tôi đoán bạn muốn đặt một hạn chế khi ai đó đang xử lý thông qua back-end và chèn trực tiếp các giá trị trong bảng. Trong trường hợp đó, Chris đề xuất một giải pháp.

Nhưng ngay cả khi bạn đang chèn từ phía sau, tôi không theo dõi lý do tại sao tôi sẽ ghi lại giao dịch khi không phải là Ghi nợ và Tín dụng.

+0

Trên thực tế nó là một dịch vụ và như một dev dịch vụ tôi không thể hoàn toàn dựa vào dữ liệu gửi cho tôi. Vì vậy, nó chỉ để phòng ngừa. – MaxRecursion

+0

Tốt để xác thực dữ liệu của bạn ở mọi cấp độ. C.f. trường hợp người nào đó nhập thủ công dữ liệu vào db và bỏ qua bất kỳ logic xác thực lớp đầu cuối hoặc thực sự nào của business. – 5arx

Các vấn đề liên quan