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

And*_*zej 3 sql sql-server

我有一张这样的表:

CREATE TABLE [dbo].[BigTable]
(
    [BigTableId] [int] IDENTITY(1,1) NOT NULL,
    [MuchText] [nvarchar](10) NOT NULL,
    [Type] [smallint] NOT NULL
    (...)
)
Run Code Online (Sandbox Code Playgroud)

MuchText可以存储任何文本值,列Type可以存储数字 1、2、3、4。

我想创建唯一索引,或者可以给我类似结果的索引MuchTextType列(因此两个值的组合将被迫是唯一的)。

但这是问题 - 我想将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'已经存在

所以这应该是不可能的:

  1. 类型 = 1,MuchText = 'XXX'
  2. Type = 2, MuchText = 'XXX'(不允许,因为已经有一个 Type = 1 和相同 MuchText 值的记录)。

但这没关系:

  1. 类型 = 1,MuchText = 'XXX'
  2. 类型 = 4,MuchText = 'XXX'

Mar*_*ith 5

您可以添加一个计算列,该列对于应组合在一起的所有类型(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)
    )
Run Code Online (Sandbox Code Playgroud)