我有一张这样的表:
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。
我想创建唯一索引,或者可以给我类似结果的索引MuchText
和Type
列(因此两个值的组合将被迫是唯一的)。
但这是问题 - 我想将Type
列中的某些值视为一个值。让我解释一下它应该如何工作:
禁止插入记录其值Type = 1
和MuchText = 'XXX'
如果与价值的记录Type = 1
和MuchText = 'XXX'
已经存在
禁止插入记录其值Type = 1
和MuchText = 'XXX'
如果与价值的记录Type = 2
和MuchText = 'XXX'
已经存在
禁止插入记录其值Type = 1
和MuchText = 'XXX'
如果与价值的记录Type = 3
和MuchText = 'XXX'
已经存在
等等,对于类型 1/2/3,但对于 Type = 4,它应该表现得像一个经典的唯一索引:
对于Type = 4
,禁止插入记录其值Type = 4
和MuchText = 'XXX'
如果与价值的记录Type = 4
和MuchText = 'XXX'
已经存在
所以这应该是不可能的:
但这没关系:
您可以添加一个计算列,该列对于应组合在一起的所有类型(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)