MySQL外键约束 - 整数列

9

我有一个整数列,想要添加外键约束。唯一的问题是如果该列没有值或不需要值,MySQL默认会放入'0'值。这显然会破坏外键约束,因为在主表中没有具有PK为0的记录。

我该如何解决这个问题?

3个回答

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)

2
然而,认真考虑一下是否允许该FK列为空。 空值表示您可以有一个没有父级的子记录。这真的是有效的业务用例吗?您能举个例子吗?
此外,空FK(或任何空列)意味着您现在正在做出关于空值含义的假设。如何判断该字段是否真的不应该有值,还是有人忘记放置值?您可以在应用程序中实现Not Null逻辑并绕过该问题,但这仍然存在风险。 比我聪明的人说,允许空值会导致数据库设计不够稳定。YMMV。也许考虑一个默认值,如-1,它仍然强制使用非空FK并查找虚拟记录。

1

或许可以在外键列中允许空值,并将默认值设置为 null。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接