Khi tôi đang sử dụng Khóa ngoại trong MySQL, tôi sẽ gặp lỗi nếu giá trị nguồn là 0 (vì không có bản ghi đích nào có ID 0). Vì vậy, tôi đang thay đổi cột nguồn thành NULL và sau đó nó hoạt động. Tuy nhiên, tôi không chắc chắn nếu điều này là đúng cách này nên được thực hiện. Là nó đúng cách, hoặc tôi bằng cách nào đó có thể giữ ID nguồn thiết lập để 0 thay vì NULL?Khóa ngoài cũng có thể bằng không
Trả lời
Khóa ngoại là những hạn chế. Điều này có nghĩa rằng nếu giá trị của cột có khóa ngoài được đặt thành bất kỳ thứ gì (và "bất kỳ" nào không bao gồm NULL
), thì giá trị đó phải tồn tại trong bảng được tham chiếu hoặc MySQL sẽ ném một lỗi. Vì vậy, trong ngắn hạn, bạn có thể đặt giá trị thành NULL
, loại bỏ ràng buộc khóa ngoài và đặt giá trị thành bất kỳ thứ gì bạn muốn, bao gồm 0
hoặc thêm bản ghi với 0
trong bảng được tham chiếu. Trong số các tùy chọn này, đặt giá trị thành NULL
có vẻ là sạch nhất.
Có, đây là cách phù hợp. Toàn bộ điểm của một FK là để thực thi rằng một bản ghi với ID tham chiếu thực sự tồn tại. Vì vậy, nếu bạn đặt cột FK thành 0, phải có bản ghi có ID 0.
Cách duy nhất xung quanh việc này là làm cho cột FK NULL có thể thực hiện được, như bạn đã làm.
Ở mức nào, tại sao bạn muốn đặt cột FK thành 0? Giá trị chuẩn cho "không tồn tại" trong SQL là NULL.
Đó là cách phù hợp. 0 là một giá trị và null nói rằng không có gì trong cột.
sử dụng NULL tốt hơn 0 vì hai lý do. đầu tiên, rõ ràng hơn là giá trị "đặc biệt" (không có gì buộc các id bảng luôn không khác, mặc dù nó thường đúng đối với các id được tạo tự động) và thứ hai nó hoạt động trong SQL với ràng buộc khóa ngoài.
vì vậy những gì bạn đang làm là thực hành phổ biến - nhiều người sử dụng NULL làm điểm đánh dấu cho biết "thiếu giá trị", và đó là điều mà ràng buộc khóa ngoài của SQL mong đợi.
cách khác để xử lý các giá trị bị thiếu là sử dụng bảng "liên kết" thứ ba có mục nhập chỉ khi có kết nối giữa hai lớp (như bạn thực hiện trong quan hệ nhiều-nhiều). điều này tránh sự cần thiết cho một NULL, và do đó được ưa thích bởi một số thuần túy cơ sở dữ liệu, nhưng làm cho mọi thứ phức tạp hơn. xem Nullable Foreign Key bad practice? để thảo luận thêm.
Sự khác biệt nào đối với bạn nếu đó là '0' hoặc' NULL'? Chưa kể rằng từ quan điểm logic, '0' đơn giản là không có ý nghĩa. – Jon