是否可以使用具有NULL值的外键?

时间:2014-06-02 18:22:47

标签: database-design foreign-keys

我知道以前曾问过类似的问题,但对我来说仍然不清楚。

我有一个名为“cities”的表和一个名为“profiles”的表。城市是用户在“配置文件”表上输入的可选字段。所以fk_id_city可能是NULL。

1)如果想要使用外键,管理这种情况的最佳做法是什么? (有些人建议我不要在这些情况下使用FK。)

2)我想到的一个想法是让表“城市”的第一行为“待定义”,所以如果用户没有从表单中选择任何城市,而不是有一个NULL字段我会有一个“1”。你会建议吗?

E.G。

表城市

id_city (pk)      city_name 
---------------------------------
1                 to be defined
2                 New York
3                 London 
4                 Buenos Aires

表格简介

id_profile (pk)      Name         fk_id_city 
----------------------------------------
1                    Paul            2       
2                    John            1 
3                    Paul            1

其他信息: 如果我尝试将fk_id_city保留为空,则会出现以下错误:错误1452:无法添加或更新子行:外键约束失败(db / profile,CONSTRAINT fk_id_city FOREIGN KEY(fk_id_city)REFERENCES cities(id_city)ON DELETE CASCADE ON UPDATE CASCADE)

1 个答案:

答案 0 :(得分:2)

在标准SQL中,定义了FOREIGN KEY约束的列将允许空值,即使在被引用的表中没有相应的null也是如此。如果您通过在列定义中未指定NOT NULL来选择允许它们,则允许为空。然而,这有很多问题。并非所有DBMS都遵循ISO标准,因此不同产品之间的行为可能不同。某些应用程序和开发工具也可能以与DBMS不一致的方式处理可空约束。数据库用户可能无法理解可以为空的外键是什么意思或知道期望什么行为 - 例如,许多人可能会在外键列和它引用的列之间编写内部联接,并期望返回所有行,但如果某些值为空则不会出现这种情况。

因此,考虑一下可以为空的外键在数据模型中逻辑的含义。为什么在没有定义城市时要填充空值?在您的情况下,一个简单的替代方法是创建一个包含不可为空的列id_profilefk_id_city的新表。只有在定义了城市时才填充该表。