为什么 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 上的所有约束,而无需破译特定类型。
我正在尝试了解 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 上的所有约束,而无需破译特定类型。