以下SQL代码创建了两个表,(A)__tableA__
,(B)__tableB__
。两个表都包含2个唯一键,名为k1
和k2
。
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
命令所示,键k1
和k2
的属性(列)集是
{a}
和{a,b}
{a}
和{a}
。这表明在MySQL中, 唯一键的概念与候选键 / 超级键的概念不对应的结论的的:
在情况(A)中,k1
和k2
不能成为候选键,因为{a} ⊂ {a,b}
(因此k2
的属性集不是最小的)。
在情况(B)中,k1
和k2
不能是超级密钥,因为它们是具有相同属性集的不同密钥。
我的问题:这个结论是否正确?如果是这样,哪个权威来源明确说明了什么?
答案 0 :(得分:1)
你是对的。在SQL中,唯一性约束中定义的列集不一定是键(最小超级键),如果这些列的某些适当子集对其具有唯一性约束,则肯定不是。
与标准SQL不同,MySQL语法的特点是它使用“KEY”作为“INDEX”的同义词,这似乎表明MySQL的作者要么不知道也不关心密钥是什么!