主键的一部分只有一个 NULL

use*_*916 3 null sql-server constraint

我有两个日期列:“开始日期”和“完成日期”。

我想确保对于一个主键(在我的情况下是复合键),“完成日期”列中只能有一个空值(如果它是 NULL,则应该是当前状态)。有没有办法做到这一点?

为了说明这一点,主键的一部分应该只有一个 NULL。以下是列:

PeriodID | PersonID | StartDate | FinishDate
       1          1      1/1/10      10/1/10
       2          1     10/1/10         NULL  
       3          1    somedate   MUST NOT BE NULL
Run Code Online (Sandbox Code Playgroud)

是的,“PersonID”是外键。

我正在使用 SQL Server 2008。

编辑 :

我得到了一个有效的答案,但其他方式也很好。

a1e*_*x07 5

如果我正确理解您的问题,SQLServer 的部分索引可以完成这项工作:

-- only 1 FinishDate nullable 
CREATE UNIQUE INDEX IDXU_TAB1_1NULL ON TableName(FinishDate) WHERE FinishDate IS NULL;
-- or only 1 FinishDate is nullable for the same PersonId
CREATE UNIQUE INDEX IDXU_TAB2_1NULL ON TableName(PersonId, FinishDate) 
WHERE FinishDate IS NULL;
Run Code Online (Sandbox Code Playgroud)

只是重复已经说过的:
1. 作为 PK 一部分的任何列都不能为空
2. 正如 Chris Travers在他对另一个答案的评论中提到的那样,NULL当涉及到唯一约束时,SQLServer以与其他 RMDS 不同的方式对待s