部分唯一检查约束

Sea*_* K. 6 sql-server constraint sql-server-2012 check-constraints

我有一个正在迁移到 SQL Server 的旧 Access 表,其中有一个名为“LinkedID”的字段。这个字段在大约 5 年前大部分时间都没有使用,因此对于许多历史记录,它要么为空,要么默认为“00000000”。但是,展望未来,我们希望将其设置为不允许重复值(假设 1,000 条记录为空,500 条记录为“00000000”,大约 10,000 条是我们想要的实际唯一值)。

调查它,因为我有多个记录设置为“00000000”和多个为空,我知道我不能使用唯一约束。有没有一种方法可以创建一个检查约束来检查插入/更新的值是否唯一(如果不是全部为 0 或为空)?或者如果它不能通过检查约束工作,我的另一个想法是可能使用插入/更新触发器以某种方式验证数据?

ype*_*eᵀᴹ 11

您可以为此使用过滤的唯一索引

CREATE UNIQUE INDEX LinkedID_Unique_except_Zeroes_or_Null 
    ON dbo.oldAccessTable (LinkedID)  
    WHERE LinkedID <> '00000000' ;  
Run Code Online (Sandbox Code Playgroud)

条件 ( LinkedID <> '00000000') 满足这两个要求,即具有'00000000'或 的行NULL被忽略并且不存储在索引中,因此不会检查它们的唯一性。