SQL Server UNIQUE constraint with duplicate NULLs
Possible Duplicate:
How do I create unique constraint that also allows nulls in sql server
我有一个表,我需要强制列具有唯一值。
此列必须是可空的,并且应该允许业务逻辑使用多个NULL值,而其他重复值则不允许。
SQL Server UNIQUE约束在这种情况下并不好,因为它将NULL视为常规值,因此它将拒绝重复的NULL。
目前,BLL授予了价值唯一性,所以我不是在寻找一个肮脏的黑客来使其发挥作用。
我只是想知道是否有一个干净的解决方案来在DB中强制执行此约束。
是的,我知道我可以写一个触发器来做到这一点:触发器是唯一的解决方案吗? (或者最好的解决方案呢?)
如果您使用的是SQL Server 2008(不适用于早期版本),则存在过滤索引的概念。您可以在表的已过滤子集上创建索引。
1 2 | CREATE UNIQUE INDEX indexName ON tableName(columns) INCLUDE includeColumns WHERE columnName IS NOT NULL |
这个问题有问题吗?
计算出的列技巧被广泛称为"nullbuster";我的笔记记录了Steve Kass:
1 2 3 4 5 6 | CREATE TABLE dupNulls ( pk int identity(1,1) primary key, X int NULL, nullbuster as (case when X is null then pk else 0 end), CONSTRAINT dupNulls_uqX UNIQUE (X,nullbuster) ) |
适用于SQL Server 2000.您可能需要
1 | ALTER DATABASE MyDatabase SET ARITHABORT ON |
如果您使用的是SQL Server 2008,请查看Filtered Indexes以实现您的目标。
对于旧版本的SQL Server,触发器的可能替代方法涉及计算列:
http://www.sqlmag.com/article/articleid/98678/sql_server_blog_98678.html
1 | will work only in Microsoft SQL Server 2008 |
您可以创建一个视图,在该视图中只选择非空值并在其上创建索引。
这是源 - 创建索引视图
您应该在该列中使用UNIQUEIDENTIFIER,可以为NULL,并且根据定义也是唯一的。
希望有所帮助。