2017-05-05 32 views
0

我有一个Student表具有组合密钥[Name, Status]上的唯一性。我可以将特定的学生标记为已删除,但稍后我可以将其加入。基本上,我可以拥有多个具有相同名称和Deleted状态的条目。但是如果我应用独特的约束,那么它不会允许我这样做。SQL Server:实现唯一的约束,除了一个可重复的值

所以我创建了一个接受名称和状态的新函数。如果状态被删除,那么它返回trues,如果不是被删除,则它返回记录数。

内部检查我检查返回值是否小于1,只有那么我允许一个新的插入。当我调用这个函数时,它显示正确的结果,但在CHECK约束不起作用。

记录

ID Name Status 
------------------- 
1 Ram  Deleted 
1 Ram  Deleted 
2 Sham Active 
2 Sham Deleted 

我可以插入记录

2 Sham Deleted 

,但它不应该允许

2 Sham Active 

在此先感谢

+0

为什么你要插入“2 Sham Deleted”?问题应该是如果我想插入“Sham”,那么它将不会允许,因为有一个活动的“假”。但是如果我想插入Ram然后带有Ram的新记录将以Active状态插入。任何低于uniuw的索引都可以在两种情况下运行。 – KumarHarsh

回答

4

你正在寻找一个筛选索引。你希望学生在未被删除时是唯一的。

create unique index unq_student_id_active 
    on student(name) 
    where status = 'Active'; 

SQL Server中的筛选索引是最近添加的;如果它们不适用于您的版本,请使用您使用的版本标记您的问题。