2010-10-28 46 views
8

Tôi có cột số nguyên mà tôi muốn thêm ràng buộc khóa ngoài vào. Chỉ có vấn đề là nếu cột đó không có/cần một giá trị, theo mặc định, MySQL đặt giá trị '0'. Điều này rõ ràng phá vỡ ràng buộc khóa ngoại khi không có bản ghi nào trong bảng chính với PK là 0.Ràng buộc khóa ngoài của MySQL - Cột số nguyên

Làm cách nào để khắc phục sự cố này?

Trả lời

7

Bạn có thể muốn đặt khóa ngoại của mình để chấp nhận NULL giá trị và sử dụng NULL thay vì giá trị 0.

Khái niệm, NULL có nghĩa là thiếu thiếu giá trị không xác định. Nếu hàng của bạn "không có/cần giá trị", tôi tin rằng NULL phù hợp hoàn hảo.

Và có, giá trị NULL sẽ không phá vỡ ràng buộc khóa ngoại của bạn.

Hãy xây dựng một ví dụ cơ bản:

CREATE TABLE parents (
    id  int PRIMARY KEY, 
    value int 
) ENGINE = INNODB; 

CREATE TABLE children (
    id   int PRIMARY KEY, 
    parent_id int, 
    FOREIGN KEY (parent_id) REFERENCES parent (id) 
) ENGINE = INNODB; 

Sau đó:

INSERT INTO parents VALUES (1, 100); 
Query OK, 1 row affected (0.00 sec) 

INSERT INTO children VALUES (1, 1); 
Query OK, 1 row affected (0.00 sec) 

INSERT INTO children VALUES (2, 0); 
ERROR 1452 (23000): A foreign key constraint fails 

INSERT INTO children VALUES (2, NULL); 
Query OK, 1 row affected (0.00 sec) 

SELECT * FROM children; 
+----+-----------+ 
| id | parent_id | 
+----+-----------+ 
| 1 |   1 | 
| 2 |  NULL | 
+----+-----------+ 
2 rows in set (0.01 sec) 
1

lẽ cho phép null trong cột chính nước ngoài của bạn và thiết lập mặc định để null.

2

Tuy nhiên, hãy nghĩ rằng dài và cứng về việc cho phép cột FK đó là rỗng. Null có nghĩa là bạn có thể có một hồ sơ con mà không có cha mẹ. Đây thực sự là một trường hợp kinh doanh hợp lệ? Bạn có thể đưa ra một ví dụ trong trường hợp này hợp lệ không?

Ngoài ra, một FK rỗng (hoặc bất kỳ cột trống nào) có nghĩa là bạn hiện đang đưa ra các giả định về ý nghĩa của giá trị rỗng. Làm thế nào để bạn biết liệu lĩnh vực này thực sự không có nghĩa vụ phải có một giá trị, vs ai đó quên đặt một giá trị? Bạn có thể thực hiện logic Không Null trong ứng dụng và bỏ qua vấn đề theo cách đó, mặc dù điều này vẫn liên quan đến rủi ro. Tâm trí tốt hơn tôi đã nói rằng việc cho phép null gây ra thiết kế cơ sở dữ liệu kém ổn định hơn. YMMV. Có lẽ xem xét một giá trị mặc định như -1 mà vẫn buộc một FK không null và nhìn lên đến một bản ghi giả.

Các vấn đề liên quan