2

下面的 SQL 代码创建两个表, (A) __tableA__, (B) __tableB__。两个表都包含 2 个唯一键,分别命名为k1k2

SHOW VARIABLES WHERE Variable_name = 'version';    # 5.0.51b

CREATE TABLE __tableA__ (`a` INT, `b` INT,
  UNIQUE KEY `k1`(`a`),
  UNIQUE KEY `k2`(`a`,`b`)
);                                       # Key_name      Column_name
                                         # -------------------------
SHOW KEYS FROM __tableA__;               # k1            a
                                         # k2            a
                                         # k2            b
CREATE TABLE __tableB__ (`a` INT,
  UNIQUE KEY `k1`(`a`),
  UNIQUE KEY `k2`(`a`)
);                                       # Key_name      Column_name
                                         # -------------------------
SHOW KEYS FROM __tableB__;               # k1            a
                                         # k2            a

DROP TABLE __tableA__;     # cleanup
DROP TABLE __tableB__;     #

如命令所示,键的SHOW KEYS属性(列)集k1k2

  • 答:{a}{a,b},分别,
  • B:{a}{a},分别。

这表明,在 MySQL 中,唯一键的概念不对应于候选键/超级键的任何一个概念:在情况 (A) 中, k1并且k2不能是候选键,因为{a} ⊂ {a,b}(因此属性集k2不是最小的)。在情况(B)中,k1并且k2不能是超级键,因为它们是具有相同属性集的不同键。

我的问题:这个结论正确吗?如果是这样,哪个权威来源明确说明了这一点?

4

1 回答 1

1

你说的对。在 SQL 中,唯一性约束中定义的列集不一定是键(最小超键),如果这些列的某些适当子集也具有唯一性约束,则肯定不是。

与标准 SQL 不同,MySQL 语法的一个特点是它使用“KEY”作为“INDEX”的同义词,这似乎表明 MySQL 的作者不知道或不在乎什么是键!

于 2012-10-03T21:40:29.830 回答