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