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

Khóa ngoại có thể là NULL và / hoặc trùng lặp không?

Câu trả lời ngắn gọn:Có, nó có thể là NULL hoặc trùng lặp.

Tôi muốn giải thích lý do tại sao một khóa ngoại có thể cần rỗng hoặc có thể cần phải là duy nhất hoặc không phải là duy nhất. Trước tiên, hãy nhớ một khóa Ngoại chỉ yêu cầu giá trị trong trường đó phải tồn tại trước tiên trong một bảng khác (bảng mẹ). Đó là tất cả những gì một FK theo định nghĩa. Null theo định nghĩa không phải là một giá trị. Null nghĩa là chúng ta chưa biết giá trị là gì.

Hãy để tôi cho bạn một ví dụ thực tế. Giả sử bạn có một cơ sở dữ liệu lưu trữ các đề xuất bán hàng. Giả sử thêm rằng mỗi đề xuất chỉ có một người bán hàng được chỉ định và một khách hàng. Vì vậy, bảng đề xuất của bạn sẽ có hai khóa ngoại, một có ID khách hàng và một có ID đại diện bán hàng. Tuy nhiên, tại thời điểm bản ghi được tạo, một đại diện bán hàng không phải lúc nào cũng được chỉ định (vì chưa có ai rảnh làm việc trên nó), vì vậy ID khách hàng được điền nhưng ID đại diện bán hàng có thể bị trống. Nói cách khác, thông thường bạn cần khả năng có FK rỗng khi bạn có thể không biết giá trị của nó tại thời điểm nhập dữ liệu, nhưng bạn biết các giá trị khác trong bảng cần được nhập. Để cho phép null trong một FK nói chung, tất cả những gì bạn phải làm là cho phép null trên trường có FK. Giá trị null tách biệt với ý tưởng về nó là một FK.

Việc nó là duy nhất hay không duy nhất liên quan đến việc bảng có mối quan hệ một-một hay một-nhiều với bảng mẹ. Bây giờ nếu bạn có mối quan hệ một-một, bạn có thể có tất cả dữ liệu trong một bảng, nhưng nếu bảng quá rộng hoặc nếu dữ liệu thuộc một chủ đề khác (nhân viên - ví dụ bảo hiểm @tbone đã đưa ra chẳng hạn), sau đó bạn muốn các bảng riêng biệt với một FK. Sau đó, bạn sẽ muốn biến FK này trở thành PK (đảm bảo tính duy nhất) hoặc đặt một hạn chế duy nhất lên nó.

Hầu hết các FK dành cho mối quan hệ từ một đến nhiều và đó là những gì bạn nhận được từ FK mà không cần thêm ràng buộc về lĩnh vực này. Vì vậy, bạn có một bảng đơn hàng và bảng chi tiết đơn hàng chẳng hạn. Nếu khách hàng đặt hàng mười mặt hàng cùng một lúc, anh ta có một đơn đặt hàng và mười bản ghi chi tiết đơn đặt hàng có cùng ID đặt hàng như FK.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MAX so với Top 1 - cái nào tốt hơn?

  2. SqlDateTime.MinValue! =DateTime.MinValue, tại sao?

  3. Kích hoạt đăng nhập trong SQL Server

  4. Tập lệnh nhanh trả về tất cả các thuộc tính từ SERVERPROPERTY () trong SQL Server 2017/2019

  5. Khám phá cơ sở dữ liệu khôi phục máy chủ SQL với tùy chọn khôi phục so với không khôi phục