为什么 SQL 中存在唯一索引?

Why do unique indices exist at all in SQL?

我正在尝试了解 SQL 中唯一索引的原因。

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

但是如果

CREATE TABLE t1 (col1, col2 UNIQUE);

类似于:

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

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

这是什么原因?

SQL 有很多看似冗余的地方。例如:

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

还有更多例子。

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

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

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

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

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