唯一索引或唯一键?

55

唯一索引和唯一键有什么区别?

7个回答

43

独特的部分并不是差异所在。索引和主键不是同一件事,也无法进行比较。

主键(Primary Key)是一列或多列数据,通过强制约束使其唯一,可以是主键或明确定义为唯一约束。而索引则是一种用于存储数据位置以便更快检索的结构。

参考文档:

唯一索引(Unique Index)

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

唯一键(Unique key)(约束)

您可以使用唯一约束来确保在不参与主键的特定列中不输入重复值。尽管唯一约束和主键约束都可实现唯一性,但当您要强制执行非主键的一列或多列(组合)的唯一性时,请使用唯一约束,而不是主键约束。


26

这篇MSDN文章比较了这两种方法。术语上“约束”是ANSI标准,但在SQL Server中你无法禁用唯一约束...

对于大多数情况来说,它们没有区别 - 约束实际上是在底层实现为一个索引。MSDN文章支持这一点 - 差异在于元数据,例如:

  • 调整FILLFACTOR
  • INCLUDE提供更高效的覆盖索引(组合键约束)
  • 过滤索引类似于子集约束/忽略多个null值等。

3
“the constraint is implemented as an index under the covers” 的翻译是“这个约束在底层实现时被作为一个索引”,完全正确,否则的话,要高效地强制执行它将是不可能的,需要有一个索引。 - Reversed Engineer
@ReversedEngineer 我想如何 SQL Server 选择实现唯一约束完全是一个内部实现细节。它可以选择每次扫描整个表。或者可能会决定由于已经有了覆盖所需内容的索引,因此只需使用该索引。如果您可能删除其他索引,那么它可能会创建自己的索引。您实际上能保证的唯一约束是它是一个约束。而如果创建一个唯一索引,则肯定会获得一个索引。 - Ian Boyd

5
“唯一键”是一个重言式。键(也称为“候选键”)是数据库的逻辑特征 - 强制表中一组属性的唯一性的约束。
索引是一种物理级别的功能,旨在以某种方式优化性能。有许多类型的索引。

5
以下是几个关键区别:

目的:

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

筛选选项:

  • 唯一键(Unique Key):不支持筛选选项
  • 唯一索引(Unique Index):支持筛选选项

存储选项:

  • 唯一键(Unique Key):仅支持文件组
  • 唯一索引(Unique Index):支持文件组或分区

图标:

  • 唯一键(Unique Key):图标为垂直键[enter image description here]
  • 唯一索引(Unique Index):图标为B树[enter image description here]

3

唯一键:它是一种对数据库施加限制的约束条件。这种限制是不允许重复值存在。例如,如果您想将某一列选为主键,则该列应为NOT NULL和UNIQUE。

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


0

关键字和索引都是表行的标识符。
尽管索引是平行的标识结构,包含指向已识别行的指针,而关键字是就地字段成员。

作为标识符的关键字意味着唯一性(约束)和NOT NULL(约束)。 将NULL用作标识符没有意义(因为null无法识别任何内容),也不具有非唯一标识值。
非聚集索引可以包含实际数据,不用作实际数据的标识符,因此可以是非唯一的[1]。

不幸的是,将关键字或索引(标识符)称为约束(规则或限制)是一种不好的做法,这也是大多数先前答案所遵循的。

关键字在以下情况下使用:

  • 备用键(又称次要键或候选键),可以有多个
  • 组合键(几个字段组合)
  • 主键(超键),自然键或代理键,只有一个,真正用于引用完整性
  • 外键

外键是另一个表中的键(其中它是主键),甚至不是他们经常引用的键。这种用法被解释为将“外键约束”术语简化为“外键”。

主键约束实际上意味着非空和唯一约束,以及所引用的列(或组合列)是标识符,但不幸的是被“主键”或“主键约束”替代,而它既不能仅称为(主键)约束,也不能仅称为(主)键。


更新:
我的相关问题:
[1]
为什么需要为INDEX创建唯一参数?


0
功能大致相同,取决于您的用例。
假设您想基于CUSTOMER_ID和TEAM_NAME允许重复行。
在这种情况下,您可以同时使用以下两个:
UNIQUE INDEX idx_customer_id_name (CUSTOMER_ID, TEAM_NAME) UNIQUE KEY unique_key_customer_id_name (CUSTOMER_ID, TEAM_NAME)
但是,您应该考虑基于CUSTOMER_ID AND TEAM_NAME检索记录的频率。如果它更多,那么您应该使用唯一索引,因为它会帮助更快地检索记录,否则您应该使用唯一键,因为它会防止基于索引获取时的开销。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接