Sql server 违反null上的唯一密钥约束

Sql server 违反null上的唯一密钥约束,sql-server,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(尽管我在创建表时从未编写过default(n

例外情况:

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(尽管我在创建表时从未编写过default(null)语句)


有什么问题?代码在sqlite中工作得非常好。

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

范例

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,第14级,状态1,第1行 无法在具有唯一索引“IX_test”的对象“dbo.test”中插入重复的键行。
语句已终止。

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

如果您在列上放置了唯一键,但允许为null,则SQL威胁是100%正确的。对于表中的所有行,该列中只允许一个null

例如:

Column with unique key
1
2
3
NULL
4

为了保持列的唯一性,我可以在SQL Server 2008上输入除1、2、3、4或NULL以外的任何内容,您可以使用筛选索引。SQL Server 2005,使用索引视图。

如果您正在运行SQL 2008,则可以按照建议使用筛选索引


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

  • 带有删除空值的where子句的索引--视图
  • computed column——约束位于将null转换为PK的case语句上
  • 触发器--触发器是唯一的约束,但忽略空值
  • 规范化——将数据放在另一个表中,其中不存在空值的行
另外,回答说明,在SQL 2008中,您可以提供一个过滤索引


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

WTF!然后。。。。世界跆拳道联盟!我可以做些什么作为解决办法?不使用唯一的!?!尽管我需要(即手动强制执行)是的,但由于帖子被标记为SQL Server,我假设他想要解释SQL Server如何处理唯一键,我很可能会使用SQL 08
create unique nonclustered index idx on dbo.DimCustomer(emailAddress)
where EmailAddress is not null;