唯一约束与唯一索引

时间:2010-07-21 04:02:20

标签: sql-server database-design unique-constraint unique-index

我有兴趣了解开发人员更喜欢使用哪种技术来强制SQL Server中的唯一性:UNIQUE CONSTRAINT或UNIQUE INDEX。鉴于每种物理实现方式差异不大,您如何确定哪种方法最佳?

是否有其他原因可以评估最佳解决方案?

是否有数据库管理优势?

4 个答案:

答案 0 :(得分:31)

这篇比较两者的MSDN文章是针对SQL Server 2000的:http://msdn.microsoft.com/en-us/library/aa224827(SQL.80).aspx

在大多数情况下,没有区别 - 约束是作为封面下的索引实现的。虽然有能力禁用约束,但它实际上并不适用于SQL Server。

只有你想调整FILLFACTOR之类的东西才能实现唯一约束。

SQL Server 2008+添加了INCLUDE以提供更有效的覆盖索引。过滤的索引=对行子集的唯一约束/忽略多个null等。

答案 1 :(得分:30)

它们是not significantly different.当您创建唯一约束时,SQL Server将自动为您创建唯一索引。

使用创建索引的语法,您可以更好地控制定义唯一索引以指定聚簇/非聚簇,包含列,文件组,索引筛选(SqlSvr2008)等。

在大多数情况下,约束是优选的,因为它表达了唯一性的意图:它是一个约束。索引不表达这一意图。

至于可管理性,影响很小。您可以管理索引(rebuild,reorg),就好像它是独立于约束创建的一样。唯一的区别是约束取决于索引,因此要删除索引,您还必须删除约束。

答案 2 :(得分:2)

我的两分钱:当我想描述业务逻辑和索引时,当我想提高性能时,我会使用约束。它们可以在DBMS中实现相同的事实并不意味着定义这些对象的原因之间的区别并不重要。

答案 3 :(得分:1)

唯一约束仅表示唯一性,删除约束将删除引擎创建的索引。可以更改索引以消除它的唯一性,并且您仍然拥有索引。我认为可以假设大多数专栏强制实施独特性也可以作为性能指标的一个指标;因此,我主要使用独特的索引。我只对需要唯一但性能不佳的列使用唯一约束(即需要唯一的varchar(200));在这种情况下,我想明确指出它是独一无二的,但尽管有潜在的索引,但搜索的可能并不是那么好。