Đầu tiên, chúng tôi có tính năng thực tế lý do. Các khóa ngoại được duy trì và kiểm tra bằng cách sử dụng các chỉ mục. Để một chỉ mục có thể sử dụng được, chúng ta cần biết các giá trị (tìm kiếm) của tất cả các cột trong chỉ mục. Nếu chúng ta có chỉ mục / pk trên (a,b)
và chúng tôi có giá trị khóa ngoại là (NULL,1)
, chúng tôi không thể tìm kiếm trong chỉ mục để xác định xem có hàng nào có b
giá trị của 1. Điều này sẽ làm cho khóa ngoại "đắt" để duy trì.
Nhưng thứ hai, chúng ta cần xem xét tính nhất quán. Đối với trường hợp cột đơn, nó khá khó kiểm soát - nếu bạn có một giá trị trong cột FK, thì cần phải có một giá trị phù hợp trong cột được tham chiếu. Ngược lại, nếu cột FK là NULL
thì ràng buộc không được chọn.
Nhưng, làm thế nào để chúng tôi mở rộng điều này sang nhiều cột? là gì quy tắc trên? Không có một đơn lẻ nào giải thích rõ ràng, nhưng thay vào đó là nhiều giải thích. Quy tắc trên có phải là "nếu tất cả các cột không phải là NULL, thì ràng buộc được chọn "hoặc" nếu bất kỳ các cột không phải là NULL, thì ràng buộc được kiểm tra "? Các quy tắc này giống hệt nhau khi chỉ một cột duy nhất đang được xem xét.
Bạn mong đợi quy tắc là quy tắc thứ hai, trong khi thực tế nó là quy tắc đầu tiên. Điều này được ghi lại một cách rõ ràng :