我可以对NULLable字段有唯一约束吗?

时间:2011-08-09 17:13:00

标签: sql-server sql-server-2008

我有一张表有以下的情绪

CREATE TABLE MyTable  
(  
  ID                INTEGER DEFAULT(1,1),  
  FirstIdentifier   INTEGER NULL,  
  SecondIdentifier  INTEGER NULL,  
--.... some other fields .....  
) 

现在每个FirstIdentifier& SecondIdentifier是唯一但可以为NULL的。我想在每个列上放置一个唯一的约束,但不能这样做,因为它的NULLable可以有两行,其中NULL值将使这些唯一约束失败。关于如何在架构级别上解决它的任何想法?

5 个答案:

答案 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上使用过滤谓词

来自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选项。