在SQL Server中创建UNIQUE索引作为“索引”或“约束”有什么区别?

时间:2008-10-21 14:23:44

标签: sql-server indexing constraints unique

在要创建UNIQUE(但不是表的主键)的列上创建索引时,SQL Server让我选择几个选项:

1)我可以选择它作为约束或索引 我猜这意味着如果我将它设置为约束,它将不会在查询时使用它,只有在写入时。但是,我能想到的SQL Server强制执行该约束的唯一有效方法是实际构建索引。这个选项有什么用?

2)另外,如果我将其设置为“index”,我可以指定它应该忽略重复的键。 这对我来说最令人费解...... 我再次猜测它意味着与约束相反。它可能意味着“在查询时使用它,但在写入时甚至不检查” 但那我为什么要把它设为独一无二? 我猜测SQL Server可以做一些优化,但我想更好地理解它。

有谁知道SQL Server对这些选项的确切了解? 将索引设置为Unique,但忽略重复键的用例是什么?

注意:这适用于SQL Server 2000


编辑:根据您所说的,但是......如果我创建了一个约束,它是否会用于加速使用约束中的字段进行过滤的查询?

谢谢!

4 个答案:

答案 0 :(得分:8)

UNIQUE约束是ISO / ANSI SQL标准的一部分,而索引不是因为标准与实现无关。与大多数SQL DBMS一样,SQL Server将使用索引来实现UNIQUE约束。

可以说,在SQL脚本中使用UNIQUE而不是索引稍微更容易移植,但是如果它提供优化机会等,则不应该排除专有语法。

答案 1 :(得分:5)

SQL Server将构建一个索引来实现UNIQUE约束。您可以在sys.key_constraints视图中看到用于强制执行唯一约束的唯一索引的引用(在2005年 - 抱歉,我不知道2000当量)。但是这两个版本在查询时都会使用索引。

不同之处在于,如果您创建索引,则可以更好地控制索引的构建方式。特别是,您可以包含可以与密钥一起查找的其他列。

这两个选项都允许您在现有数据上“忽略重复键”,但如果您尝试插入与现有重复的值,则两者都会引发错误之一。

答案 2 :(得分:2)

唯一约束和唯一索引之间没有实际区别,除了唯一约束也被列为数据库中的约束对象这一事实。

答案 3 :(得分:2)

根据MSDN,通过唯一约束创建唯一索引或使用CREATE UNIQUE INDEX语句显式创建之间没有显着差异。在这两种情况下,数据都以相同的方式验证其唯一性,并且查询优化器也不会对它们进行任何不同的处理。作为良好实践,如果数据完整性是目标,则使用唯一约束,否则直接使用CREATE UNIQUE INDEX语句。

Here是一篇优秀的文章和视频,解释了两种方法之间的区别。