Mah*_*rma 1 sql database sql-server database-design unique-constraint
我们有三列的表格,StudentId并SubjectId与Active(和其他一些列,但都没有涉及这个问题).
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)
从我们的应用程序,如果我们尝试插入与此相结合的另一个记录SubjectId和studentId插入失败和Java抛出以下错误:
引起:com.microsoft.sqlserver.jdbc.SQLServerException:无法在对象'dbo.StudentSubject'中插入具有唯一索引'UQ_StudentSubject_SubjectId_StudentId'的重复键行.重复键值为(113460,182).
组合113460,182的记录的活动为零,因此,我们尝试插入新记录而不是将活动标志设置为1.
如果我们插入一条带有subjectId和studentId的现有组合的新记录,那么我们可以在插入时忽略这个索引Active吗?
编辑 抱歉混淆,这是一个索引而非约束.
下面是一个筛选索引的示例,它将忽略Active值为0的行:
CREATE UNIQUE NONCLUSTERED INDEX UQ_StudentSubject_SubjectId_StudentId
ON dbo.StudentSubject
(
[StudentId],
[SubjectId]
) WHERE Active <> 0;
Run Code Online (Sandbox Code Playgroud)