如何在NULL列上创建唯一索引?

17 浏览
0 Comments

如何在NULL列上创建唯一索引?

我正在使用SQL Server 2005。我希望将一个列的值限制为唯一的,同时允许空值。

我的现有解决方案是在一个视图上创建一个唯一索引,如下所示:

<代码>CREATE VIEW vw_unq WITH SCHEMABINDING AS

SELECT Column1

FROM MyTable

WHERE Column1 IS NOT NULL

CREATE UNIQUE CLUSTERED INDEX unq_idx ON vw_unq (Column1)

还有更好的想法吗?

0
0 Comments

如何在一个NULL列上创建唯一索引?

在SQL中,NULL是一个特殊的值,表示没有值。然而,在SQL Server中,创建唯一索引时,NULL列通常会导致问题。这是因为SQL Server默认情况下不允许在NULL列上创建唯一索引,这与其他数据库管理系统不同。

有人提出了一个不错的解决方法,可以通过创建一个带有WHERE子句的唯一索引来解决这个问题。具体来说,可以使用以下代码创建一个唯一索引,并排除NULL值:

CREATE UNIQUE INDEX idx_name ON table_name(column_name) WHERE column_name IS NOT NULL;

这样一来,就可以在一个NULL列上创建唯一索引,并且可以插入多个NULL值。

然而,也有人认为在一个NULL列上创建唯一索引违反了唯一性的目的,因为NULL不等于NULL。他们认为SQL Server应该遵循SQL规范,并允许在NULL列上创建多个NULL值。

总之,虽然在SQL Server中创建一个在NULL列上的唯一索引可能会导致一些争议,但可以使用带有WHERE子句的CREATE UNIQUE INDEX语句来实现这一点。这种方法允许在NULL列上创建唯一索引,并且可以插入多个NULL值。但需要注意的是,这种做法可能与SQL规范不符,并且在其他数据库管理系统中可能不适用。

0
0 Comments

如何在一个NULL列上创建唯一索引?

在创建唯一索引时,如果要对一个NULL列进行操作,可能会遇到一些问题。一种常见的解决方法是使用计算列技巧,也被广泛称为“nullbuster”。具体做法是在表中创建一个计算列,通过判断NULL列的值来确定计算列的值,并将计算列作为唯一索引的一部分。这种方法的一个示例是:

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)
)

使用这种方法可以解决在NULL列上创建唯一索引的问题。但是需要注意的是,如果在不同的表中使用相同的ID,可能会导致冲突。

另一种改进方法是使用ISNULL函数来替代计算列的方法。具体做法是将NULL列的值转换为一个非NULL的值,例如将其转换为一个字符串。这样可以避免计算列的使用,但是在视觉上可能不如计算列的方法直观。

总结起来,当需要在一个NULL列上创建唯一索引时,可以使用计算列技巧或者使用ISNULL函数来解决该问题。具体选择哪种方法取决于个人的需求和偏好。

0
0 Comments

在SQL Server 2008中,可以使用过滤索引创建一个唯一索引。另一个选择是使用触发器来检查唯一性,但这可能会影响性能。注意:目前SQL Server Management Studio似乎不知道如何创建这样的索引,所以如果您稍后修改表,它会混淆并尝试删除索引,因此请记得重新创建它。看起来微软已经更新了SSMS以支持此功能。我使用的是SSMS 10.50.1617版本,在索引属性对话框中,您可以选择“筛选器”页面来编辑筛选器,例如"([Column1] IS NOT NULL)"。允许在索引中包含多个空值和从索引中筛选掉空值是两码事。过滤索引实际上是从索引中排除记录,而其他解决方案则将空值转换为有用的唯一值。请注意这种区别。如果您在使用具有过滤索引的表上的存储过程,请确保ANSI_NULLSON,否则在尝试插入数据时会出错。对于包含某些整数的列和其他整数的主键的情况,如果您搜索可为空的列=某个整数,那么空值替换技术是有风险的-有一个非零的机会,可为空的列中存在一个整数值,该整数值也存在于主键列中,这可能导致您找到错误的行!从索引中排除您不想找到的行更安全。

0