在null上违反UNIQUE KEY约束

时间:2010-05-21 19:19:24

标签: sql-server

例外:

Violation of UNIQUE KEY constraint 'UQ__user_dat__AB6E61641273C1CD'. Cannot insert duplicate key in object 'dbo.user_data'.
The statement has been terminated.

AB6E61641273C1CD =唯一且空白的电子邮件

我的SQL语句不会为电子邮件插入值。所以我假设它将默认为null(尽管我在创建表时从未写过默认(null)语句。)

有什么问题?该代码完美地在sqlite中工作。

6 个答案:

答案 0 :(得分:7)

如果您正在运行SQL 2008,则可以使用建议的here过滤索引。

create unique nonclustered index idx on dbo.DimCustomer(emailAddress)
where EmailAddress is not null;

答案 1 :(得分:5)

在SQL Server 2008上,您可以使用过滤索引。 SQL Server 2005,使用索引视图。

答案 2 :(得分:5)

如果您想要一个忽略Null的唯一键,那么在SQL Server中是不可能的。但是this article描述了如何获得该行为 通过

  • 带有删除空值的where子句的索引视图
  • 计算列 - 约束是在将空值转换为PK
  • 的case语句中
  • 触发器 - 触发器确实是一个唯一约束,但忽略空值
  • 规范化 - 将数据放在Null不存在行的另一个表中

另外AlexKuznestov's回答说明在SQL 2008中,您可以提供过滤索引。

其中最好的是索引视图,但是像触发器一样,它的存在并不总是显而易见的。计算列很有趣,但您需要能够保证实际数据永远不会与您“封装”的列冲突。

答案 3 :(得分:1)

唯一约束只允许SQL Server中有1个空值,例如Oracle允许许多NULLS

例如

create table test (id int)


CREATE UNIQUE NONCLUSTERED INDEX [IX_test] ON [dbo].[test] 


insert test values(NULL)

--will fail
insert test values(NULL)

Msg 2601,Level 14,State 1,Line 1 无法在对象'dbo.test'中使用唯一索引'IX_test'插入重复的键行。 声明已经终止。

答案 4 :(得分:1)

如果在列上放置唯一键但是允许空值,那么SQL Menace是100%正确的。对于表中的所有行,该列中只允许有一个空值。

示例:

Column with unique key
1
2
3
NULL
4

为了使列唯一,我可以输入除1,2,3,4或NULL

之外的任何内容

答案 5 :(得分:0)

电子邮件列中可能已经有一行为null。