47

What is the diffrence between a unique index and a unique key?

4

7 回答 7

40

独特的部分不是差异所在。索引和键不是一回事,没有可比性。

键是一个数据列或多个列,它们通过约束强制唯一,无论是主键还是显式定义的唯一约束。而索引是一种用于存储数据位置以便更快检索的结构。

从文档:

唯一索引

在表或视图上创建唯一索引。唯一索引是不允许任何两行具有相同索引键值的索引。视图上的聚集索引必须是唯一的

唯一键(约束)

您可以使用 UNIQUE 约束来确保在不参与主键的特定列中没有输入重复值。尽管 UNIQUE 约束和 PRIMARY KEY 约束都强制唯一性,但当您想要强制非主键的列或列组合的唯一性时,请使用 UNIQUE 约束而不是 PRIMARY KEY 约束。

于 2010-09-25T17:07:36.647 回答
24

这篇比较两者的 MSDN 文章是您所追求的。术语是这样的“约束”是ANSI,但在SQL Server中你不能禁用唯一约束......

对于大多数目的,没有区别 - 约束是作为索引实现的。MSDN 文章支持这一点——区别在于元数据,例如:

  • 调整填充因子
  • INCLUDE 提供更高效的覆盖索引(复合约束)
  • 过滤索引就像对行子集的约束/忽略多个空值等。
于 2010-09-25T18:25:08.003 回答
5

“唯一键”是一个重言式。键(又名“候选键”)是数据库的逻辑特征 - 强制执行表中一组属性的唯一性的约束。

索引是一种物理级别的功能,旨在以某种方式优化性能。有许多类型的索引。

于 2010-09-25T18:59:25.913 回答
2

唯一键:它是对数据库施加限制的约束。该限制是它不允许重复值。例如,如果您想选择一列作为主键,它应该是 NOT NULL & UNIQUE。

唯一索引:它是一种在对数据库执行查询时提高性能的索引。在唯一索引中,它也不允许索引中的重复值。即,没有两行将具有相同的索引键值。

于 2010-09-26T04:27:02.313 回答
1

以下是几个关键区别:

目的:

  • 唯一键:保证表级数据的完整性,使表中不能输入重复项。不用于查询计划,不影响查询速度。(它与主键的用途不同,主键唯一标识每条记录,用于更新/删除等数据操作。在复杂的表中,唯一键可以是多列的组合,使用唯一键来标识记录效率低下)事务。因此,主键是识别表中特定记录的快速方法,而唯一键保证没有两条记录具有相同的键属性。)
  • 唯一索引:确保数据在索引级别的唯一性,不能保证表级别的唯一性,例如在过滤索引的情况下。用于查询计划和获取数据,从而根据使用/查询的列加快查询速度。

过滤器选项:

  • 唯一键:过滤选项不可用
  • 唯一索引:过滤器选项可用

存储选项:

  • 唯一键:仅文件组
  • 唯一索引:文件组或分区

图标:

  • 唯一键:图标为垂直键 [ 在此处输入图像描述]
  • 唯一索引:图标是 b-tree [ 在此处输入图像描述]
于 2020-09-06T18:35:30.427 回答
0

键(又名关键字)和索引都是表行的标识符。
虽然索引是并行标识结构,包含指向已标识行的指针,而键是原位字段成员。

作为标识符的键意味着唯一性(约束)和 NOT NULL(约束)。NULL 作为标识符没有意义(因为 null 不能识别任何东西)以及非唯一的识别值。
非聚集索引可以包含真实数据,不作为真实数据的标识符,因此是非唯一的 [1]

不幸的是,键或索引(标识符)是由约束(规则或限制)调用的,这里大多数先前的答案都是如此。

密钥用于以下情况:

  • 备用 aka 辅助 aka 候选键,可以是多个
  • 复合键(几个字段组合)
  • 主键(superkey),自然键或代理键,只有一个,真正用于参照完整性
  • 外键

外键是另一个表中的键(它是主键),甚至不是他们经常引用的键。这种使用是通过将“外键约束”术语的快捷方式混淆为“外键”来解释的。

主键约束实际上意味着 NOT NULL 和 UNIQUE 约束 + 引用的列(或组合列)是标识符,并且不幸地被“主键”或“主键约束”取代,而这两者都不能仅由(主键) 约束或仅通过(主)键。


更新:
我的相关问题:
[1]
INDEX 创建的唯一参数 - 有什么用?

于 2010-09-26T16:03:53.343 回答
0

功能或多或少相同,这取决于您的用例。

假设您要允许基于 CUSTOMER_ID 和 TEAM_NAME 的重复行。

在这种情况下,您可以同时使用:

  • 唯一索引idx_customer_id_name( CUSTOMER_ID, TEAM_NAME)
  • 唯一键unique_key_customer_id_name( CUSTOMER_ID, TEAM_NAME)

但是您应该考虑根据 CUSTOMER_IDTEAM_NAME 获取记录的频率。如果它更多,那么您应该使用唯一索引,因为它有助于更​​快地检索记录,否则您应该使用唯一键,因为它可以防止无意中听到基于索引的获取。

于 2020-06-25T07:38:21.093 回答