Sql server 什么';创建一个唯一的索引作为;索引“;或称为;“约束”;在SQL Server中?

Sql server 什么';创建一个唯一的索引作为;索引“;或称为;“约束”;在SQL Server中?,sql-server,indexing,constraints,unique,Sql Server,Indexing,Constraints,Unique,在为将是唯一的列(但不是表的主键)创建索引时,SQL server让我选择几个选项: 1) 我可以选择将其作为约束或索引。 我猜这意味着,如果我将它设置为约束,它在查询时不会使用它,只有在编写时才会使用它。然而,我能想到的SQL Server实施该约束的唯一有效方法是实际构建索引。这个选项有什么用 2) 另外,如果我将其设置为“索引”,那么让我指定它应该忽略重复的键。 这对我来说是最令人费解的… 我再次猜测它的意思是约束的反面。它可能意味着“在查询时使用它,但在编写时甚至不要检查”。 但是为什么

在为将是唯一的列(但不是表的主键)创建索引时,SQL server让我选择几个选项:

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

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

有人知道SQL Server使用这些选项到底做了什么吗?
将索引设置为唯一但忽略重复键的用例是什么

注意:这是针对SQL Server 2000的


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


谢谢

SQL Server将构建一个索引以实现唯一约束。您可以看到对用于在视图中强制唯一约束的唯一索引的引用(在2005年-对不起,我不知道2000年的等效项)。但两个版本在查询时都将使用索引

不同之处在于,如果创建索引,则可以更好地控制其构建方式。特别是,您可以包括其他列,这些列可能会随键一起频繁查找


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

唯一约束和唯一索引之间没有实际区别,唯一约束也作为约束对象列在数据库中

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


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

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


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

我一直想知道这种差异。唯一索引和唯一约束之间的区别。虽然将某个对象标记为唯一键而不是唯一索引有一些好处,因为像ORMs这样的数据库工具会注意到唯一键,并可能利用它们。唯一键几乎总是最小的,因此是“候选键”,而唯一索引可能是如此标记的常规(性能增加)索引,因为它们碰巧包含唯一键的所有列(使它们成为“超级键”),通过将索引标记为唯一,SQL Server可以在查询优化中利用这一事实。Kevin:唯一键是主键或唯一约束。在SQL server中,使用索引实现唯一约束。这个域描述了某些东西是否需要是唯一的,与性能无关(这只是一个副作用)。事实上,我的意思是说,到处都有唯一的约束,我称之为“唯一键”。我的帖子意在指出语义上的差异,即使SQLServer对它们一视同仁。SQL Server的未来版本可能会以其他方式实现唯一约束,这可能不会提供查找好处,因此,如果目标是性能(根据经验,这些是“超级键”),则最好使用实际的唯一索引,如果目标是数据完整性(通常适用于“候选键”),则最好使用唯一约束,因为其他任何东西都是浪费的)。