not*_*d90 11 sql oracle database-design foreign-keys data-integrity
在我们的数据库项目中,我们有一个Sale
包含主键和两个独占外键的表: Vehicle_ID
和Piece_ID
.例如,如果我们出售车辆,我们需要Vehicle_ID
作为外键但不是Piece_ID
.我们可以将NULL放入Piece_ID
,外键是否可以为空?或者有办法做这个工作吗?
谢谢.
APC*_*APC 14
主键的列(或列)必须为NOT NULL.无法通过NULL唯一标识记录.因此,外键引用末尾的ID列必须定义为NOT NULL.
但是,外键关系是可选的合法设计决策,表示方式的方法是使键的引用结束是可选的,即允许NULL.
在数据建模术语中,你所描述的是一个(独占)弧:"一个表......有两个或多个外键,其中一个且只有一个非空." 在逻辑建模中,弧是完全可以接受的,但是有一大堆意见支持将它们作为单独的表来实现.在您的场景中,这将是一个通用Sale
表加上两个子类型表,VehicleSale
和PieceSale
.
单独的表实现的优点是:
然而,优点并非都是单向的.虽然这是很容易确保Sale
适用于任何一个VehicleSale
或一个PieceSale
而不是两个,执行一个规则Sale
必须有一个孩子记录实际上得到相当粗糙.
因此,流行的建议是,专属弧是错误的,这通常是好建议.但它并不像有些人那样明确.
是的,您可以这样做 - 使FK本身可以为空,但添加一个CHECK以确保其中一个包含非NULL值.
FK可以是NULL,可以建立1..0:N关系.换句话说,"子"行可以(但不是必须)具有"父"行.
NOT NULL外键模拟1:N关系.换句话说,每个孩子都必须有父母.
当FK为复合1且其至少一个字段为NULL时,将以特殊方式处理NULL和非NULL值的混合:
大多数DBMS默认为MATCH SIMPLE(除了MS Access之外),大多数DBMS默认不支持任何内容.
1你没有这里 - 只是提到完整性.
如果您的外键为空,Oracle 不应该抱怨。
您遇到过一些错误吗?