如何在插入新记录时根据列值忽略多列上的唯一索引

Mah*_*rma 1 sql database sql-server database-design unique-constraint

我们有三列的表格,StudentIdSubjectIdActive(和其他一些列,但都没有涉及这个问题).

Activecolumn指示记录是否处于活动状态(Active如果有人从UI中删除记录,我们将此列设置为零)

在列索引的定义StudentId,并SubjectId为如下:

CREATE UNIQUE NONCLUSTERED INDEX [UQ_StudentSubject_SubjectId_StudentId]  
ON [dbo].[StudentSubject]
(
    [StudentId] ASC,
    [SubjectId] ASC

)WITH(
    PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB =  OFF,     
    IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS =  ON,      
    ALLOW_PAGE_LOCKS = ON
) ON [PRIMARY]

GO
Run Code Online (Sandbox Code Playgroud)

从我们的应用程序,如果我们尝试插入与此相结合的另一个记录SubjectIdstudentId插入失败和Java抛出以下错误:

引起:com.microsoft.sqlserver.jdbc.SQLServerException:无法在对象'dbo.StudentSubject'中插入具有唯一索引'UQ_StudentSubject_SubjectId_StudentId'的重复键行.重复键值为(113460,182).

组合113460,182的记录的活动为零,因此,我们尝试插入新记录而不是将活动标志设置为1.

如果我们插入一条带有subjectId和studentId的现有组合的新记录,那么我们可以在插入时忽略这个索引Active吗?

编辑 抱歉混淆,这是一个索引而非约束.

Dan*_*man 6

下面是一个筛选索引的示例,它将忽略Active值为0的行:

CREATE UNIQUE NONCLUSTERED INDEX UQ_StudentSubject_SubjectId_StudentId  
ON dbo.StudentSubject
(
    [StudentId],
    [SubjectId]
) WHERE Active <> 0;
Run Code Online (Sandbox Code Playgroud)