在null上违反UNIQUE KEY约束

5 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.
Run Code Online (Sandbox Code Playgroud)

AB6E61641273C1CD =唯一且为NULL的电子邮件

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

问题是什么?代码在sqlite中完美地工作.

And*_*bel 7

如果您正在运行SQL 2008,则可以使用此处建议的筛选索引.

create unique nonclustered index idx on dbo.DimCustomer(emailAddress)
where EmailAddress is not null;
Run Code Online (Sandbox Code Playgroud)


A-K*_*A-K 5

在SQL Server 2008上,您可以使用筛选索引.SQL Server 2005,使用索引视图.


Con*_*rix 5

如果您想要一个忽略Null的唯一键,则在SQL Server中是不可能的.但是,本文将介绍如何通过以下方式获取该行为

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

此外,AlexKuznestov的回答指出,在SQL 2008中,您可以提供过滤索引.

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