Microsoft SQL Server:如何实现非归档条码唯一,归档条码允许重复?
问题描述
需求:非归档(Archived=0)的Barcode在表中必须唯一,归档(Archived=1)的Barcode无需唯一。
表结构包含以下列:
- ID int(数据库自动生成)
- Barcode nvarchar(50)
- Archived bit
之前尝试添加复合非聚集唯一约束,但该约束会限制归档条码只能存在一条,不符合需求:
ALTER TABLE [Parcels] ADD CONSTRAINT [Barcode_Archived] UNIQUE NONCLUSTERED ( [Barcode] ASC, [Archived] ASC )
请问如何实现非归档条码强制唯一,同时允许归档条码重复?
解决方案
使用过滤式唯一非聚集索引,仅对未归档的行约束Barcode的唯一性,归档行不受限制。执行以下SQL语句:
CREATE UNIQUE NONCLUSTERED INDEX [IX_Parcels_Barcode_Unique_Unarchived] ON [Parcels] ([Barcode]) WHERE ([Archived] = 0);
说明
- 过滤索引通过
WHERE子句限定生效范围,只针对Archived=0的行检查Barcode唯一性,完全匹配需求。 - 对于
Archived=1的归档行,该索引不会进行唯一性校验,因此可以存在重复的Barcode。 - 这种方式比复合唯一约束更精准,避免了对归档行的不必要限制。
内容的提问来源于stack exchange,提问作者napsebefya
相关产品推荐
相关产品推荐

