我有一个整数列,我想添加一个外键约束。唯一的问题是,如果该列没有/需要一个值,默认情况下MySQL会输入一个'0'值。这显然打破了外键约束,因为主表中没有PK为0的记录。
我该如何克服这个问题?
答案 0 :(得分:8)
您可能希望将外键设置为接受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 :(得分:2)
但是,请考虑长而难关于允许FK列为空。 Null表示您可以拥有没有父级的子记录。这真的是一个有效的商业案例吗?你能给出一个有效的例子吗?
此外,null FK(或任何空列)意味着您现在正在假设null意味着什么。你怎么知道这个领域真的不应该有价值,有人忘了把价值放进去?您可以在应用程序中实现Not Null逻辑并以此方式绕过问题,尽管这仍然涉及风险。 比我更好的头脑说,允许空值导致数据库设计不太稳定。因人而异。也许考虑一个像-1这样的默认值仍会强制非空FK并查找虚拟记录。
答案 2 :(得分:1)
也许允许外键列中的空值并将默认值设置为null。