我有一张这样的表:
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。
我想在MuchText
和Type
列上创建唯一的索引,或者会给我类似结果的东西(因此两个值的组合将被强制为唯一)。 / p>
但问题出在这里 - 我想将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'
的记录
所以这不应该是可能的:
但这没关系:
答案 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