使用SQL Server,我希望只对非空值创建唯一索引。

19 浏览
0 Comments

使用SQL Server,我希望只对非空值创建唯一索引。

在Sql Server中,我想要一个既包含空值又包含实际值的列。如果该列有值,我希望它是唯一的。该列可以有多行为空。

例如,假设我有一个包含3列的书籍表,分别是:

书籍编号 - 自增长
标题 - 字符串
ISBN - 字符

现在表中会有一个以自增长列为主键的主键,这是好的。问题在于ISBN列。我不希望表中出现重复的ISBN号码,但是会有很多没有ISBN号码的书籍(因为我不知道它)。

有没有办法(或者什么是最好的方法)强制执行ISBN的约束?

0
0 Comments

在SQL Server中,有一个问题是如何在只有非空值的情况下创建唯一索引。这个问题的出现可能是由于在数据库中存在重复的NULL值,但是我们希望在索引中只有非空值是唯一的。

解决这个问题的方法是使用过滤索引或计算列。

在SQL Server 2008中,可以创建一个过滤索引,如下所示:

CREATE UNIQUE INDEX indexName ON tableName(isbn) WHERE isbn IS NOT NULL

在更早的版本中,可以创建一个计算列,当ISBN存在时,计算列的值为ISBN,当ISBN为NULL时,计算列的值为主键:

CREATE TABLE tableName (
    pk int identity(1,1) primary key,
    isbn int NULL,
    nullbuster as (case when isbn is null then pk else 0 end),
    CONSTRAINT dupNulls_uqX UNIQUE (isbn)
)

以上内容摘自SQL Server UNIQUE constraint with duplicate NULLs,因此这是一个维基模式的问题。

通过使用上述方法,我们可以在SQL Server中创建一个只包含非空值的唯一索引,从而解决了重复NULL值的问题。

0