Ví dụ, tôi có một bảng có một số cột ID cho các bảng khác. Tôi muốn có một chìa khóa nước ngoài để buộc toàn vẹn chỉ khi tôi đặt dữ liệu vào đó. Nếu tôi làm một bản cập nhật tại một thời gian sau đó để cư cột đó sau đó nó vẫn sẽ kiểm tra các ràng buộc (điều này có khả năng phụ thuộc vào máy chủ cơ sở dữ liệu, tôi đang sử dụng MySQL & loại bảng InnoDB). Tôi tin rằng đây là một kỳ vọng hợp lý, nhưng đúng với tôi nếu tôi sai.Các cột trong bảng có khóa ngoại là null không?
Trả lời
Có, bạn có thể thực thi ràng buộc chỉ khi giá trị không phải là NULL. Điều này có thể dễ dàng được kiểm tra bằng ví dụ sau:
CREATE DATABASE t;
USE t;
CREATE TABLE parent (id INT NOT NULL,
PRIMARY KEY (id)
) ENGINE=INNODB;
CREATE TABLE child (id INT NULL,
parent_id INT NULL,
FOREIGN KEY (parent_id) REFERENCES parent(id)
) ENGINE=INNODB;
INSERT INTO child (id, parent_id) VALUES (1, NULL);
-- Query OK, 1 row affected (0.01 sec)
INSERT INTO child (id, parent_id) VALUES (2, 1);
-- ERROR 1452 (23000): Cannot add or update a child row: a foreign key
-- constraint fails (`t/child`, CONSTRAINT `child_ibfk_1` FOREIGN KEY
-- (`parent_id`) REFERENCES `parent` (`id`))
Chèn đầu tiên sẽ vượt qua vì chúng tôi chèn NULL vào parent_id
. Chèn thứ hai không thành công do ràng buộc khóa ngoài, vì chúng tôi đã cố gắng chèn một giá trị không tồn tại trong bảng parent
.
Bảng cha cũng có thể được khai báo với id INT NOT NULL. – Will
@CJDennis Nếu bạn làm cho nó để chỉ có một hàng có thể có một ID null, nó có thể được sử dụng như là giá trị dự phòng cho các hàng khác. (Mặc dù nó có thể làm việc tốt hơn cho DB nếu bạn chỉ sử dụng nhiều cột hơn.) Ràng buộc mặc định có vẻ như là một vấn đề nếu bạn muốn biết sau liệu giá trị ban đầu được đặt là "mặc định" (bằng cách sử dụng null) hay được đặt thành giá trị xảy ra giống với "mặc định". Bằng cách có một hàng có id rỗng, bạn có thể chỉ rõ rằng hàng này không được sử dụng như một hàng bình thường và có thể sử dụng hàng như một cách cung cấp một loại giá trị mặc định động cho các hàng khác. – Ouroborus
tôi nghĩ rằng phần 'parent_id INT NULL' là (verbosely) bằng' parent_id int default null' – Chinggis6
Có, điều đó sẽ hoạt động như bạn mong đợi. Thật không may, tôi dường như gặp khó khăn khi tìm một tuyên bố rõ ràng về điều này trong số MySQL manual.
Khóa ngoại nghĩa là giá trị phải tồn tại trong bảng khác. NULL đề cập đến sự vắng mặt của giá trị, vì vậy khi bạn thiết lập một cột để NULL, nó sẽ không có ý nghĩa để cố gắng thực thi các ràng buộc về điều đó.
Bằng cách thiết kế Khóa ngoài phải tham chiếu đến một số khóa (Chính) không phải là NULL, nhưng trong giai đoạn phát triển khi chúng ta cần có nhiều dữ liệu đầu tiên được chèn vào bảng con, chúng ta không biết nó sẽ tham chiếu đến ai (bảng cha)). Đó là lý do tại sao chúng tôi có giá trị NULL được cho phép. Trong sản xuất có NULL sẽ là một luồng thiết kế, có thể được nói gần như. –
Tôi thấy rằng khi chèn, các giá trị cột rỗng phải được khai báo cụ thể là NULL, nếu không tôi sẽ nhận được một lỗi vi phạm ràng buộc (trái ngược với một chuỗi rỗng).
Bạn không thể đặt giá trị mặc định của NULL trên cột để cho phép điều này? –
Có, trong hầu hết các ngôn ngữ NULL khác với một chuỗi rỗng. Có lẽ tinh tế khi bắt đầu, nhưng rất quan trọng để nhớ. – Gary
Hey Backslider, bạn nói "(trái ngược với một chuỗi rỗng)", nhưng tôi không nghĩ rằng bạn có nghĩa là bạn sẽ INSERT một giá trị của chuỗi rỗng, mà là, bạn không chỉ định một giá trị tại cho Giá trị ở tất cả? tức là bạn thậm chí không đề cập đến cột trong 'INSERT INTO {table} {list_of_columns}' của bạn? Bởi vì đó là sự thật đối với tôi; bỏ qua đề cập đến cột gây ra lỗi, nhưng bao gồm và thiết lập rõ ràng để sửa lỗi NULL.Nếu tôi đúng, tôi nghĩ rằng bình luận của Gary không áp dụng (bởi vì bạn không có nghĩa là một chuỗi rỗng), nhưng @Kevin Coulombe có thể hữu ích ... –
- 1. Có tốt không khi có khóa ngoại là khóa chính?
- 2. Truy vấn nơi cột khóa ngoài có thể là NULL
- 3. Thêm khóa ngoại vào bảng hiện có
- 4. Tìm các cột KHÔNG NULL trong PostgreSQL
- 5. Thêm cột có khóa chính trong bảng hiện có
- 6. Một đến nhiều liên kết - Tham gia các bảng có cột khóa không chính trong JPA
- 7. Bảng MySQL với cột VARCHAR là khóa ngoài
- 8. Các khóa ngoại có nên trở thành khóa chính của bảng không?
- 9. Tôi có cần thêm chỉ mục trên bảng mySQL nếu cột ID là khóa chính không?
- 10. Không có khóa chính hoặc ứng cử viên trong bảng tham chiếu phù hợp với danh sách cột tham khảo trong khóa ngoại
- 11. Cách tìm hiểu xem cột của mô hình có phải là khóa ngoại không?
- 12. h2 sql, tạo bảng có khóa chính nhiều cột?
- 13. có khoá ngoại luôn luôn tham chiếu đến khóa duy nhất trong bảng khác không?
- 14. Thêm cột khóa chính trong bảng SQL
- 15. Tìm tên cột có giá trị không phải là null cuối cùng trong một hàng
- 16. Ngoại lệ là NULL luôn
- 17. ActiveRecord has_many nơi hai cột trong bảng A là khóa chính trong bảng B
- 18. Slick so sánh cột bảng với null
- 19. Đặt cột làm khóa chính nếu bảng không có khóa chính
- 20. Sử dụng DbUnit với các bảng không có khóa chính
- 21. Nhiều khóa ngoại?
- 22. Thêm khóa ngoại có thể vô hiệu.
- 23. chìa khóa ngoại tham khảo 2 cột khóa chính trong SQL Server
- 24. Chính xác thì khóa ngoại là gì?
- 25. Cách cập nhật 2 cột trong 2 bảng có khóa ngoài
- 26. Thêm một cột khóa chính trong một không có bảng cũ chính primay
- 27. Chế độ xem bảng có các cột có thể khóa và cuộn ngang?
- 28. Không thể tạo trình kích hoạt Xóa vì bảng có khóa NGOẠI HỐI với tầng DELETE
- 29. Hibernate có nên có khả năng xử lý các khóa ngoại lai chồng chéo?
- 30. EF: Không thể chèn NULL để cột
Tôi không biết về MySQL, nhưng MS SQL Server cho phép khóa ngoại được vô hiệu hóa với ngữ nghĩa mà bạn muốn. Tôi hy vọng đó là hành vi tiêu chuẩn. –
khóa ngoài, không thể rỗng theo mặc định trong mySQL, lý do rất đơn giản, nếu bạn tham khảo cái gì đó và bạn để nó rỗng, bạn sẽ mất toàn vẹn dữ liệu. khi bạn tạo bộ bảng cho phép null thành NOT và sau đó áp dụng ràng buộc khóa ngoài. Bạn không thể đặt null khi cập nhật, nó sẽ gửi cho bạn một lỗi, nhưng bạn có thể (bạn phải) không cập nhật cột này và chỉ cập nhật các trường bạn cần thay đổi. – JoelBonetR