我有一個整數列,我想添加一個外鍵約束。唯一的問題是如果該列沒有/需要一個值,默認情況下,MySQL將一個'0'值。這顯然打破了外鍵約束,因爲主表中沒有PK記錄。MySQL外鍵約束 - 整數列
我該如何克服這個問題?
我有一個整數列,我想添加一個外鍵約束。唯一的問題是如果該列沒有/需要一個值,默認情況下,MySQL將一個'0'值。這顯然打破了外鍵約束,因爲主表中沒有PK記錄。MySQL外鍵約束 - 整數列
我該如何克服這個問題?
您可能希望將外鍵設置爲接受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)
也許允許空值在你的外鍵列,並設置默認爲null。
但是,認爲長和難約允許該FK列爲空。 Null意味着您可以擁有沒有父母的子記錄。這真的是一個有效的商業案例嗎?你可以舉一個例子,這是有效的嗎?
此外,空FK(或任何空列)意味着您現在正在假設有關null的含義。你怎麼知道這個領域是否真的不應該有價值,而不是有人忘記了價值?你可以在應用中實現非空邏輯,並繞過這個問題,儘管這仍然存在風險。比我更好的思想說,允許空值導致數據庫設計不太穩定。因人而異。也許考慮一個像-1那樣的默認值,它仍然強制一個非空的FK並查找虛擬記錄。