【问题标题】:Why do unique indices exist at all in SQL?为什么 SQL 中存在唯一索引?
【发布时间】:2018-01-20 12:56:48
【问题描述】:

我试图了解 SQL 中唯一索引的原因。

关于唯一约束与唯一索引的讨论很多。在大多数 SQL 实现中,不仅似乎没有任何实际区别,而且在幕后,唯一约束通常似乎与唯一索引的处理方式相同。

如果

CREATE TABLE t1 (col1, col2 UNIQUE);

类似于:

CREATE TABLE t1 (col1, col2);
CREATE UNIQUE INDEX t1_col2 ON t1 (col2);

就如何处理 UNIQUE 约束而言,为什么我们首先要有唯一索引?它们似乎是多余的。然而所有 SQL 实现似乎都有它们,这意味着它们的存在可能是有充分理由的。

这是什么原因?

【问题讨论】:

  • 在 Oracle 中,如果我没记错的话,只有在版本 7 中才添加了约束。在此之前,我们只使用唯一索引来强制执行唯一性。我同意它们是多余的,我希望它们不存在。不过,我不确定这个问题是否有非基于意见的答案。

标签: sql unique-constraint unique-index


【解决方案1】:

SQL 有许多表面上的冗余。例如:

  • SELECT DISTINCT 可以替换为 GROUP BY
  • COUNT(*) 等价于COUNT(1)SUM(1)。 (事实上​​,COUNT() 是不必要的。)
  • CROSS JOIN 基本等同于,(作用域规则略有不同,但没有人会注意到)。
  • CROSS JOIN 等价于 JOIN . . . ON 1=1

还有更多的例子。

标准 SQL 被委员会接受。不同的供应商必须就标准达成一致。与任何如此设计的东西一样,会弹出奇怪的异常情况。

我还可以补充一点,我认为索引是在约束之前出现的,所以正确的问题是为什么需要唯一的约束。

在唯一约束与唯一索引的情况下,问题可能略有不同。两人做着截然不同的事情。唯一约束是对表中的列施加约束。唯一索引用于提高性能——它是其他类型索引的变体。

在实践中,唯一约束是通过唯一索引实现的。标准中没有任何要求是这种情况,但这是显而易见的解决方案。

顺便说一句,两者之间有一个区别。可以给约束命名。这很方便,因为约束冲突通常在发生错误时使用该名称——无论约束类型如何。此外,还可以列出表上的所有约束,而无需破译特定类型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-17
    • 2021-10-08
    • 2010-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-15
    • 1970-01-01
    相关资源
    最近更新 更多