SQL Server:实现唯一约束,除了一个可以重复的值

问题描述 投票:0回答:1

我有一个

Student
表,其组合键
[Name, Status]
具有唯一性。我可以将特定学生标记为已删除,但稍后我可以将他注册。基本上,我可以有多个具有相同名称和
Deleted
状态的条目。但如果我应用唯一约束,那么它就不允许我这样做。

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

在检查内部,我检查返回值是否小于 1,然后才允许新插入。当我调用此函数时,它显示正确的结果,但放入

CHECK
约束不起作用。

记录

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

我可以插入记录

2 Sham Deleted

但不应该允许

2 Sham Active

提前致谢

sql-server database constraints unique-constraint
1个回答
12
投票

您正在寻找过滤索引。您希望学生在不被删除时是唯一的。

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

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

文档

© www.soinside.com 2019 - 2024. All rights reserved.