我有一张这样的桌子:

CREATE TABLE [dbo].[BigTable]
(
    [BigTableId] [int] IDENTITY(1,1) NOT NULL,
    [MuchText] [nvarchar](10) NOT NULL,
    [Type] [smallint] NOT NULL
    (...)
)
MuchText列可以存储任何文本值,而Type列可以存储数字1、2、3、4。

我想在MuchTextType列上创建唯一索引,或将给我类似结果的东西(因此,两个值的组合将被强制为唯一)。

但这是问题所在-我想将Type列中的某些值视为一个。让我解释一下它应该如何工作:
  • 如果值Type = 1MuchText = 'XXX'的记录已经存在
  • ,则禁止插入值Type = 1MuchText = 'XXX'的记录
  • 如果值Type = 1MuchText = 'XXX'的记录已经存在
  • ,则禁止插入值Type = 2MuchText = 'XXX'的记录
  • 如果已存在值Type = 1MuchText = 'XXX'的记录,则禁止插入值Type = 3MuchText = 'XXX'的记录

    等,对于类型1/2/3,等等,但是对于类型= 4,它的行为应类似于经典唯一索引:
  • 对于Type = 4,如果具有Type = 4MuchText = 'XXX'值的记录已经存在
  • ,则禁止插入具有Type = 4MuchText = 'XXX'值的记录

    因此,这不可能:
  • 类型= 1,MuchText ='XXX'
  • Type = 2,MuchText ='XXX'(不允许,因为已经有Type = 1且具有相同MuchText值的记录)。

  • 但这没关系:
  • 类型= 1,MuchText ='XXX'
  • 类型= 4,MuchText ='XXX'
  • 最佳答案

    您可以使用CREATE INDEX ... WHERE (cond)使用Filtered Indexes

    CREATE UNIQUE INDEX UK_BigTable123 ON BigTable (MuchText)
    WHERE Type IN (1, 2, 3)
    
    CREATE UNIQUE INDEX UK_BigTable4 ON BigTable (MuchText)
    WHERE Type = 4
    

    08-15 23:36