2010-10-28 64 views
8

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

我该如何克服这个问题?

回答

7

您可能希望将外键设置为接受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

也许允许空值在你的外键列,并设置默认为null。

2

但是,认为长和难约允许该FK列为空。 Null意味着您可以拥有没有父母的子记录。这真的是一个有效的商业案例吗?你可以举一个例子,这是有效的吗?

此外,空FK(或任何空列)意味着您现在正在假设有关null的含义。你怎么知道这个领域是否真的不应该有价值,而不是有人忘记了价值?你可以在应用中实现非空逻辑,并绕过这个问题,尽管这仍然存在风险。比我更好的思想说,允许空值导致数据库设计不太稳定。因人而异。也许考虑一个像-1那样的默认值,它仍然强制一个非空的FK并查找虚拟记录。