除了其他答案中的要点之外,这还有两者之间的一些关键区别。
注意:错误消息来自SQL Server 2012。
失误
违反唯一约束将返回错误2627。
Msg 2627, Level 14, State 1, Line 1
Violation of UNIQUE KEY constraint 'P1U_pk'. Cannot insert duplicate key in object 'dbo.P1U'. The duplicate key value is (1).
The statement has been terminated.
违反唯一索引将返回错误2601。
Msg 2601, Level 14, State 1, Line 1
Cannot insert duplicate key row in object 'dbo.P1' with unique index 'P1_u'. The duplicate key value is (1).
The statement has been terminated.
禁用
唯一约束不能被禁用。
Msg 11415, Level 16, State 1, Line 1
Object 'P1U_pk' cannot be disabled or enabled. This action applies only to foreign key and check constraints.
Msg 4916, Level 16, State 0, Line 1
Could not enable or disable the constraint. See previous errors.
但是,可以禁用主键约束或唯一约束后面的唯一索引,也可以禁用任何唯一索引。帽子提示Brain2000。
ALTER INDEX P1_u ON dbo.P1 DISABLE ;
请注意通常的警告,即禁用聚簇索引会使数据不可访问。
选件
唯一约束支持诸如FILLFACTOR
和的索引选项IGNORE_DUP_KEY
,尽管并非每种版本的SQL Server都如此。
包含的栏
非聚集索引可以包括非索引列(称为覆盖索引,这是主要的性能增强)。PRIMARY KEY和UNIQUE约束后面的索引不能包含列。帽子提示@ypercube。
筛选
唯一性约束无法过滤。
可以过滤唯一索引。
CREATE UNIQUE NONCLUSTERED INDEX Students6_DrivesLicence_u
ON dbo.Students6( DriversLicenceNo ) WHERE DriversLicenceNo is not null ;
外键约束
尽管外键约束可以引用未过滤的唯一索引(我认为这是在SQL Server 2005中添加的),但它不能引用已过滤的唯一索引。
命名
创建约束时,指定约束名称是可选的(对于所有五种约束类型)。如果您未指定名称,则MSSQL将为您生成一个名称。
CREATE TABLE dbo.T1 (
TID int not null PRIMARY KEY
) ;
GO
CREATE TABLE dbo.T2 (
TID int not null CONSTRAINT T2_pk PRIMARY KEY
) ;
创建索引时,必须指定名称。
帽子提示@ i-one。
链接
http://technet.microsoft.com/zh-CN/library/aa224827(v=SQL.80).aspx
http://technet.microsoft.com/zh-CN/library/ms177456.aspx