外键中的空值

时间:2013-06-27 15:28:31

标签: sql

这个问题已经出现了几次,但我仍然不是百分之百的问题。

我正在为银行基础设施创建一些表格。该银行为公司提供服务。公司内部存在可以访问部分或全部服务的组,具体取决于权限。但是,银行内部也有与公司无关的团体可以访问这些服务。

我的组表,具有Group_ID(PK),Company_ID和Bank_ID为(FK)。这些FK是否可以为空,具体取决于该组是公司组还是银行组?

4 个答案:

答案 0 :(得分:4)

可以为空的外键很好(至少在SQL Server中,不确定所有RDBMS)。它只是意味着列可以为null,但如果不是,那么它需要满足约束。

答案 1 :(得分:1)

这取决于你想要建立什么样的关系。

如果您尝试建模的关系不需要在相关表中存在记录,则FK可以为null(因此0..1或0..n可以为1而不是1..1或1 .. n不应该允许它。)

阅读referential actions,您将开始看到其他更精细的细节。

答案 2 :(得分:0)

SQL Server 2008 R2

  

外键   约束可以包含空值;但是,如果有任何一列   复合FOREIGN KEY约束包含空值,验证   将跳过构成FOREIGN KEY约束的所有值。要做   确保复合FOREIGN KEY约束的所有值都是   已验证,请在所有参与列上指定NOT NULL。

带有InnoDB的MySQL在外键中也是supports个空值。

答案 3 :(得分:0)

我认为您的基本型号不正确。您可能应该使用整体表(让我们称之为用户为例),其中包含需要使用系统的任何人的记录,无论是银行还是员工或任何人。它应该包含和所有类型的用户相似的信息。这是您在USERGroups表中用于将它们设置为特定组的关键。

然后公司和银行表应该有一个FK到用户表(与用户一对一关系,因此值应该是FK和PK)和taht表coantnas不同的字段对于每种类型的实体。

虽然是的,你可以拥有你描述的结构,很难强制只允许填充其中一个键。通常我只允许FK为空,如果它可能是未知的在创建记录时。例如,在教育环境中,您可能会设置一个接近一年的春季课程安排,但是有一些课程,其中春季学期的指导员尚未被聘用,因此instrutorID将为空。