2013-06-27 34 views
3

这个问题已经出现了几次,但我仍然不是100%它如何工作。空值在一个外键

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

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

回答

4

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

0

SQL Server 2008 R2

外键约束 可以包含空值;但是,如果组合FOREIGN KEY约束的任何列包含空值,则验证 将忽略组成FOREIGN KEY约束的所有值。若要确定 确认复合FOREIGN KEY约束的所有值均已验证,请在所有参与的列上指定NOT NULL。

MySQL与InnoDB也supports外键值为空。

1

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

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

阅读关于referential actions,你会开始看到一些其他更好的细节。

0

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

然后公司和银行表应该有一个FK到用户表(它们与用户有一对一的关系,所以这个值应该是FK和PK)并且表中的字段是每种类型的实体都不相同。

虽然是的,你可以拥有你描述的structre,但是很难强制只允许填充其中一个键。通常我只允许FK为null,如果它可能不是记录创建时已知。例如,在教育环境中,您可能会为接近一年前的春季制定课程表,但有些课程尚未聘请春季学期的教员,因此,InstrID ID将为空。