我有一个整数列,我想添加一个外键约束。唯一的问题是如果该列没有/需要一个值,默认情况下,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并查找虚拟记录。