2010-10-28 61 views
8

我有一個整數列,我想添加一個外鍵約束。唯一的問題是如果該列沒有/需要一個值,默認情況下,MySQL將一個'0'值。這顯然打破了外鍵約束,因爲主表中沒有PK記錄。MySQL外鍵約束 - 整數列

我該如何克服這個問題?

回答

7

您可能希望將外鍵設置爲接受NULL值,並使用NULL而不是0值。

概念上,NULL表示缺少未知值。如果你的行「不需要/不需要該值」,我相信NULL完全適合。

是的,一個NULL值不會打破你的外鍵約束。

讓我們建立一個基本的例子:

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; 

然後:

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

也許允許空值在你的外鍵列,並設置默認爲null。

2

但是,認爲長和難約允許該FK列爲空。 Null意味着您可以擁有沒有父母的子記錄。這真的是一個有效的商業案例嗎?你可以舉一個例子,這是有效的嗎?

此外,空FK(或任何空列)意味着您現在正在假設有關null的含義。你怎麼知道這個領域是否真的不應該有價值,而不是有人忘記了價值?你可以在應用中實現非空邏輯,並繞過這個問題,儘管這仍然存在風險。比我更好的思想說,允許空值導致數據庫設計不太穩定。因人而異。也許考慮一個像-1那樣的默認值,它仍然強制一個非空的FK並查找虛擬記錄。