我有一张表有以下的情绪
CREATE TABLE MyTable
(
ID INTEGER DEFAULT(1,1),
FirstIdentifier INTEGER NULL,
SecondIdentifier INTEGER NULL,
--.... some other fields .....
)
现在每个FirstIdentifier& SecondIdentifier是唯一但可以为NULL的。我想在每个列上放置一个唯一的约束,但不能这样做,因为它的NULLable可以有两行,其中NULL值将使这些唯一约束失败。关于如何在架构级别上解决它的任何想法?
答案 0 :(得分:7)
您可以使用过滤索引作为唯一约束。
create unique index ix_FirstIdentifier on MyTable(FirstIdentifier)
where FirstIdentifier is not null
答案 1 :(得分:1)
正如一些人所建议的那样,使用过滤后的索引可能是获得你想要的东西的方法。
但是直接问题的答案是,如果列具有唯一索引,则列可以为空,但只能在该字段中有一行具有空值。任何多个null都会违反索引。
答案 2 :(得分:0)
你的问题有点令人困惑。首先,在模式定义中,您说不允许您的列保存空值,但在您的描述中,您说它们可以为null。
无论如何,假设您的架构错误,并且您实际上希望列允许空值,SQL Server允许您通过向约束添加WHERE IS NOT NULL来执行此操作。
有些事情:
CREATE UNIQUE NONCLUSTERED INDEX IDX_my_index
ON MyTable (firstIdentifier)
WHERE firstIdentifier IS NOT NULL
答案 3 :(得分:0)
对字段执行过滤的唯一索引:
CREATE UNIQUE INDEX ix_IndexName ON MyTable (FirstIdentifier, SecondIdentifier)
WHERE FirstIdentifier IS NOT NULL
AND SecondIdentifier IS NOT NULL
它将允许NULL
但仍然强制执行唯一性。
答案 4 :(得分:0)
您可以在CREATE INDEX上使用过滤谓词
创建[UNIQUE] [CLUSTERED | NONCLUSTERED] INDEX index_name
ON(列[ASC | DESC] [,... n])
[INCLUDE(column_name [,... n])]
[WHERE<filter_predicate>
]
[WITH([,... n])]
[ON {partition_scheme_name(column_name)
| filegroup_name
|默认
}
]
[FILESTREAM_ON {filestream_filegroup_name | partition_scheme_name | “NULL”}]
[; ]WHERE
<filter_predicate>
通过指定筛选索引来创建筛选索引 要包含在索引中的行。过滤的索引必须是a 表上的非聚集索引。创建过滤后的统计信息 过滤索引中的数据行。过滤谓词使用简单的比较逻辑而无法引用 计算列,UDT列,空间数据类型列或 hierarchyID数据类型列。使用NULL文字的比较不是 允许比较运算符。使用IS NULL和IS NOT NULL 而不是运营商。
以下是一些过滤谓词的例子 Production.BillOfMaterials表:
WHERE StartDate&gt; '20040101'ANDDate&lt; =''20040630'
WHERE ComponentID IN(533,324,753)
WHAD StartDate IN('20040404','20040905')AND EndDate IS NOT NULL
过滤的索引不适用于XML索引和全文索引。 对于UNIQUE索引,只有选定的行必须具有唯一索引 值。过滤的索引不允许使用IGNORE_DUP_KEY选项。