13

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

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

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

有谁知道 SQL Server 究竟对这些选项做了什么?
将索引设置为唯一但忽略重复键的用例是什么?

注意:这适用于 SQL Server 2000


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

谢谢!

4

4 回答 4

8

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

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

于 2008-10-21T15:24:35.537 回答
5

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

不同之处在于,如果您创建索引,您可以更好地控制它的构建方式。特别是,您可以包括可能与键一起经常查找的其他列。

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

于 2008-10-21T14:40:51.727 回答
2

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

于 2008-10-21T14:45:34.323 回答
2

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

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

于 2012-09-14T14:44:56.063 回答