这个问题已经在这里有一个答案:
- 外键可以为NULL和/或复制? 11个回答
在我们的数据库项目中,我们有一个表Sale
有一个主键和两个独特的外键: Vehicle_ID
和Piece_ID
。 例如,如果我们卖一车,我们需要Vehicle_ID
作为一个外键,但不Piece_ID
。 可我们把NULL来Piece_ID
,可以外键为空? 或者是有没有办法做这个工作?
谢谢。
这个问题已经在这里有一个答案:
在我们的数据库项目中,我们有一个表Sale
有一个主键和两个独特的外键: Vehicle_ID
和Piece_ID
。 例如,如果我们卖一车,我们需要Vehicle_ID
作为一个外键,但不Piece_ID
。 可我们把NULL来Piece_ID
,可以外键为空? 或者是有没有办法做这个工作?
谢谢。
主键的列(或列)必须是NOT NULL。 A记录不能由NULL被唯一标识。 因此,外键的引用端ID列必须被定义为NOT NULL。
然而,这是一个外键关系是可选的合法的设计决策,并表示该方法是通过使键可选的参考结束,即允许空值。
在数据建模方面你所描述的是一个(独家)弧:“一张桌子有两个或两个以上的外键,其中一个只有其中之一可以是不空。” 在逻辑建模弧是完全可以接受的,但有意见的强壮的身体有利于实现它们作为单独的表。 在您的方案,这将是一个通用的Sale
表,还要加上两个子类型的表, VehicleSale
和PieceSale
。
附表实现的优点是:
然而,优势并不都是单向的。 虽然这是很容易确保Sale
适用于任何一个VehicleSale
或PieceSale
但不能同时,执行一个规则Sale
必须有一个子记录实际上得到相当粗糙。
所以,当时的建议是一个独特的圆弧是错误的,它通常是很好的建议。 但它不是明确的,因为一些做出来。
是的,你可以做到这一点 - 让FKS自己为空的,但添加一个检查,以确保他们的只有一个包含非NULL值。
一个FK可为空的,该车型1..0:N的关系。 换句话说,一个“孩子”行可以 (但不是必须)有一个“家长”排。
NOT NULL外键模式1:N的关系。 换句话说,每个孩子都必须有一个父。
当FK是复合材料1,并且其字段中的至少一个是NULL-能,NULL和非空值的混合以特殊的方式进行处理:
大多数的DBMS默认以匹配SIMPLE(有显着的例外的MS Access ),最不支持什么,但默认。
1,你不必在这里-只是提它的完整性。
根据你所说的“排他性外键”什么,你可能是车辆和部件的一些较大的超类的两个子类的思维,把它出售的物品。
如果使用所谓的“类表继承”设计模式,你将有三个表,一个超类,并为每个子类的表。 如果另外,您可以使用一个名为“共享主键”的设计,你可以使用所有三个表相同的主键。
这将使你的销售表有一个外键,Saleable_Item_Id,引用Saleable_Item表,也无论是汽车还是一块表,视情况而定。 这可能会制定出一个比你现有的设计更好。
谷歌“级表继承”和“共享主键”的更多细节。
如果你有一个空的外键甲骨文不应该抱怨。
是你遇到了一些错误,运行?