【发布时间】:2012-05-16 20:13:42
【问题描述】:
以下 SQL 代码创建两个表,(A) __tableA__,(B) __tableB__。两个表都包含两个唯一键,分别命名为 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}, - B:分别为
{a}和{a}。
这表明,在 MySQL 中,unique key 的概念并不对应于 candidate key / superkey 的任何一个概念:
在情况(A)中,k1 和 k2 不能作为候选键,因为 {a} ⊂ {a,b}(因此 k2 的属性集不是最小的)。
在情况 (B) 中,k1 和 k2 不能是超级键,因为它们是具有相同属性集的不同键。
我的问题:这个结论正确吗?如果是这样,哪个权威人士明确说明了这一点?
【问题讨论】:
-
说实话我从来没有听说过这两个概念,所以首先感谢你让我进步。然后,在阅读了一些关于它之后,我的问题如下:对你来说,唯一索引不是超键的原因是什么?
-
候选键/超级键是很少与 RDBMS 实现相关的数据建模术语。 Superkey 是什么意思?
-
也许这个问题更适合 dba.stackexchange.com
-
@Songo: Superkey vs Candidate key 没问题,有据可查。