例外:
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中工作。
答案 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描述了如何获得该行为 通过
另外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。