Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Ràng buộc khóa ngoại trong bảng con cho phép chèn các giá trị không tồn tại trong bảng mẹ

Đầ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 :



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Hai truy vấn trong một bảng kết quả?

  2. Kiểm tra lược đồ máy chủ SQL?

  3. Lưu trữ tệp trong cơ sở dữ liệu SQL Server bằng .Net MVC3 với Entity Framework

  4. Tìm các sự kiện đồng thời trong cơ sở dữ liệu giữa các thời điểm

  5. pyodbc trên google colab