sql – 外键可以为空吗?

这个问题在这里已经有一个答案:> Can a foreign key be NULL and/or duplicate?7个
在我们的数据库项目中,我们有一个具有主键和两个专用外键的表Sale:Vehicle_ID和Piece_ID.例如,如果我们出售车辆,我们需要Vehicle_ID作为外键,而不是Piece_ID.我们可以把NULL放到Piece_ID,外键可以是空吗?还是有办法做这项工作?

谢谢.

解决方法

主键的列(或列)必须不为空.无法通过NULL唯一标识记录.因此外键的引用端的ID列必须定义为NOT NULL.

然而,外键密钥关系的合法设计决策是可选的,而通过使密钥的引用结束可选的方式来表示,这就是允许NULL.

在数据建模术语中,您所描述的是一个(排他)弧:“一个具有两个或多个外键的表,其中只有一个可以是非空”.在逻辑建模中,弧线是完全可以接受的,但有强烈的意见,有利于将它们实现为单独的表格.在您的场景中,这将是一个通用的销售表加上两个子类型表,“VehicleSaleand”PieceSale.

独立表实现的优点是:

更易于执行外键约束;
>更容易添加与不适用于零件销售的(例如)车辆销售相关的附加列;
>使用附加子类型更容易扩展模型;
>更清晰的数据模型,可以简化应用开发.

但是,优点并不是单向的.虽然很容易确保销售适用于VehicleSale或PieceSale,但不能同时适用,但执行销售必须具有子记录的规则实际上会变得非常好.

所以,普遍的建议是,排除弧是错误的,一般都是很好的建议.但这并不像有些人所说的那么清楚.

相关文章

SELECT a.*,b.dp_name,c.pa_name,fm_name=(CASE WHEN a.fm_n...
if not exists(select name from syscolumns where name=&am...
select a.*,pano=a.pa_no,b.pa_name,f.dp_name,e.fw_state_n...
要在 SQL Server 2019 中设置定时自动重启,可以使用 Window...
您收到的错误消息表明数据库 'EastRiver' 的...
首先我需要查询出需要使用SQL Server Profiler跟踪的数据库标...