唯一索引并将多个值视为一个SQL

时间:2016-06-12 18:08:17

标签: sql sql-server

我有一张这样的表:

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列上创建唯一的索引,或者会给我类似结果的东西(因此两个值的组合将被强制为唯一)。 / p>

但问题出在这里 - 我想将Type列中的某些值视为一个。让我解释它应该如何运作:

  1. 如果值Type = 1MuchText = 'XXX'的记录已存在,则禁止插入值为Type = 1MuchText = 'XXX'的记录

  2. 如果值Type = 1MuchText = 'XXX'的记录已存在,则禁止插入值为Type = 2MuchText = 'XXX'的记录

  3. 如果值Type = 1MuchText = 'XXX'的记录已存在,则禁止插入值为Type = 3MuchText = 'XXX'的记录

    等。对于类型1/2/3等,但对于Type = 4,它应该表现得像一个经典的唯一索引:

  4. 对于Type = 4,如果值Type = 4MuchText = 'XXX'的记录已存在,则禁止插入值为Type = 4MuchText = 'XXX'的记录

  5. 所以这不应该是可能的:

    1. Type = 1,MuchText ='XXX'
    2. Type = 2,MuchText ='XXX'(不允许,因为已经存在Type = 1和相同MuchText值的记录)。
    3. 但这没关系:

      1. Type = 1,MuchText ='XXX'
      2. Type = 4,MuchText ='XXX'

2 个答案:

答案 0 :(得分:4)

您可以添加一个计算列,该列对于应该组合在一起的所有类型(下面为Grp)具有相同的值,并将其包含在约束中。

CREATE TABLE [dbo].[BigTable](
    [BigTableId] [int] IDENTITY(1,1) NOT NULL,
    [MuchText] [nvarchar](10) NOT NULL,
    [Type] [smallint] NOT NULL,
    Grp AS CASE WHEN [Type] IN (1,2,3) THEN 1 ELSE 2 END,
    UNIQUE(Grp, MuchText)
    )

答案 1 :(得分:2)

您可以使用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