【问题标题】:What's the use of a unique index?唯一索引有什么用?
【发布时间】:2018-11-17 18:17:22
【问题描述】:

这可能是一个非常愚蠢的问题,但我从未使用过唯一索引:不过,我使用了唯一约束。

我阅读了相关问题Unique index vs. unique constraint that uses a unique index,但仍然无法真正理解为什么存在唯一索引。

对我来说 UNIQUE 听起来更像是一个约束而不是一个索引。它不应该总是被指定为约束吗?或者我在这里错过了什么? (最有可能的)。所以简而言之,我的问题是:

  • 唯一索引有什么用?

也许答案就在历史书中,并且与它们是如何按时间顺序发展的有关。

【问题讨论】:

标签: sql indexing unique-constraint


【解决方案1】:

PostgreSQL documentation on unique constraints 中给出了唯一索引可以做的唯一约束不能做的事情。

仅涵盖某些行的唯一性限制不能写为唯一性约束,但可以通过创建唯一部分索引来强制执行此类限制。

他们在partial unique index docs 中举了一个例子。

假设我们有一个描述测试结果的表格。我们希望确保给定主题和目标组合只有一个“成功”条目,但可能有任意数量的“不成功”条目。这是一种方法:

CREATE UNIQUE INDEX tests_success_constraint ON tests (subject, target) WHERE success;

【讨论】:

  • 哇,很有趣。尽管无论如何都不是标准功能,但索引似乎(已经)比约束更容易调整。
  • @TheImpaler create index 根本不是 SQL 标准的一部分。索引不是标准的一部分,我假设他们认为它们是实现细节。
【解决方案2】:

通常,唯一约束是使用唯一索引实现的(据我所知,无论数据库如何)。两者之间的差异非常小——在违反约束的情况下,通常只与约束的名称有关。一些数据库允许您为唯一索引选择索引类型,因此这将是另一个细微差别。

为什么两者存在?我可以推测。 SQL 的设计者几乎同意,实现唯一约束的唯一合理方法是通过唯一索引。鉴于CREATE INDEX 已经存在,为什么不简单地允许一个独特的选项呢?毕竟,数据库需要支持创建唯一索引的能力。

【讨论】:

  • 因此,索引可能更易于调整:这是一个好点。是的,答案可能是历史性的。
  • "SQL 的设计者..." SQL 的设计者根本没有处理索引。 create index 不是标准的一部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-04
  • 1970-01-01
  • 2011-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-09
相关资源
最近更新 更多