MySQL外键约束 - 整数列

时间:2010-10-28 20:01:03

标签: sql mysql foreign-keys

我有一个整数列,我想添加一个外键约束。唯一的问题是,如果该列没有/需要一个值,默认情况下MySQL会输入一个'0'值。这显然打破了外键约束,因为主表中没有PK为0的记录。

我该如何克服这个问题?

3 个答案:

答案 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。