【发布时间】:2015-09-30 01:00:26
【问题描述】:
我们有一个包含三列的表,StudentId 和 SubjectId 和 Active(以及其他一些列,但与此问题无关)。
Active 列指示记录是否处于活动状态(如果有人从 UI 中删除记录,我们将此 Active 列设置为零)
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
在我们的应用程序中,如果我们尝试使用 SubjectId 和 studentId 的组合插入另一条记录,则插入失败并且 Java 抛出以下错误:
原因:com.microsoft.sqlserver.jdbc.SQLServerException: 不能 在具有唯一性的对象“dbo.StudentSubject”中插入重复的键行 索引“UQ_StudentSubject_SubjectId_StudentId”。重复键值 是 (113460, 182)。
组合为 113460、182 的记录的 Active 为零,因此,我们尝试插入新记录,而不是将 Active 标志设置为 1。
如果我们插入一条新记录,现有的 subjectId 和 studentId 组合的 Active 列为零,有什么方法可以在插入时忽略此索引?
编辑 对不起,这是一个索引而不是一个约束。
【问题讨论】:
-
在索引中添加
Active列会解决这个问题吗? -
没有唯一约束,但您可以创建一个指定
WHERE Active = 0的唯一过滤索引。 -
我们不想将活动列添加到索引中,问题是如果我们将来不活动该列,将会有两列具有相同的组合,因此更新可能会失败。 @FelixPamittan
-
@DanGuzman 我的上述评论有意义吗?
-
我对过滤索引一无所知。将谷歌它。 @FelixPamittan
标签: sql sql-server database database-design unique-constraint