唯一键与候选键/超级键(MySQL)

时间:2012-05-16 20:13:42

标签: mysql sql

以下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)中,k1k2不能成为候选键,因为{a} ⊂ {a,b}(因此k2的属性集不是最小的)。 在情况(B)中,k1k2不能是超级密钥,因为它们是具有相同属性集的不同密钥。

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

1 个答案:

答案 0 :(得分:1)

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

与标准SQL不同,MySQL语法的特点是它使用“KEY”作为“INDEX”的同义词,这似乎表明MySQL的作者要么不知道也不关心密钥是什么!