外键可以为空? [重复](Can Foreign Key be null? [duplicate

2019-07-17 13:05发布

这个问题已经在这里有一个答案:

  • 外键可以为NULL和/或复制? 11个回答

在我们的数据库项目中,我们有一个表Sale有一个主键和两个独特的外键: Vehicle_IDPiece_ID 。 例如,如果我们卖一车,我们需要Vehicle_ID作为一个外键,但不Piece_ID 。 可我们把NULL来Piece_ID ,可以外键为空? 或者是有没有办法做这个工作?

谢谢。

Answer 1:

主键的列(或列)必须是NOT NULL。 A记录不能由NULL被唯一标识。 因此,外键的引用端ID列必须被定义为NOT NULL。

然而,这是一个外键关系是可选的合法的设计决策,并表示该方法是通过使键可选的参考结束,即允许空值。

在数据建模方面你所描述的是一个(独家)弧:“一张桌子有两个或两个以上的外键,其中一个只有其中之一可以是不空。” 在逻辑建模弧是完全可以接受的,但有意见的强壮的身体有利于实现它们作为单独的表。 在您的方案,这将是一个通用的Sale表,还要加上两个子类型的表, VehicleSalePieceSale

附表实现的优点是:

  • 更容易执行外键约束;
  • 容易添加与其他列(说)汽车销售并不适用于部分销售;
  • 更容易延伸,以与附加的子类型的模型;
  • 更清晰的数据模型,它可以简化应用开发。

然而,优势并不都是单向的。 虽然这是很容易确保Sale适用于任何一个VehicleSalePieceSale但不能同时,执行一个规则Sale 必须有一个子记录实际上得到相当粗糙。

所以,当时的建议是一个独特的圆弧是错误的,它通常是很好的建议。 但它不是明确的,因为一些做出来。



Answer 2:

回答:

是的,你可以做到这一点 - 让FKS自己为空的,但添加一个检查,以确保他们的只有一个包含非NULL值。

阐述:

一个FK可为空的,该车型1..0:N的关系。 换句话说,一个“孩子”行可以 (但不是必须)有一个“家长”排。

NOT NULL外键模式1:N的关系。 换句话说,每个孩子都必须有一个父。

当FK是复合材料1,并且其字段中的至少一个是NULL-能,NULL和非空值的混合以特殊的方式进行处理:

  • 如果FK是MATCH FULL,要么所有的值必须为NULL或所有的值必须是非NULL和匹配一些父行。
  • 如果FK是MATCH PARTIAL,只有那些价值非NULL必须有的父行匹配(NULL值被忽略)。
  • 如果FK是MATCH SIMPLE,或者所有的值都是非空的,必须一些父行匹配,或者有至少一个NULL值(在这种情况下,非空值不需要匹配)。

大多数的DBMS默认以匹配SIMPLE(有显着的例外的MS Access ),最不支持什么,但默认。


1,你不必在这里-只是提它的完整性。



Answer 3:

根据你所说的“排他性外键”什么,你可能是车辆和部件的一些较大的超类的两个子类的思维,把它出售的物品。

如果使用所谓的“类表继承”设计模式,你将有三个表,一个超类,并为每个子类的表。 如果另外,您可以使用一个名为“共享主键”的设计,你可以使用所有三个表相同的主键。

这将使你的销售表有一个外键,Saleable_Item_Id,引用Saleable_Item表,也无论是汽车还是一块表,视情况而定。 这可能会制定出一个比你现有的设计更好。

谷歌“级表继承”和“共享主键”的更多细节。



Answer 4:

如果你有一个空的外键甲骨文不应该抱怨。

是你遇到了一些错误,运行?



文章来源: Can Foreign Key be null? [duplicate]