【问题标题】:Unique key vs Candidate key / Superkey (MySQL)唯一键与候选键/超级键(MySQL)
【发布时间】:2012-05-16 20:13:42
【问题描述】:

以下 SQL 代码创建两个表,(A) __tableA__,(B) __tableB__。两个表都包含两个唯一键,分别命名为 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 中,unique key 的概念并不对应于 candidate key / superkey 的任何一个概念: 在情况(A)中,k1k2 不能作为候选键,因为 {a} ⊂ {a,b}(因此 k2 的属性集不是最小的)。 在情况 (B) 中,k1k2 不能是超级键,因为它们是具有相同属性集的不同键。

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

【问题讨论】:

  • 说实话我从来没有听说过这两个概念,所以首先感谢你让我进步。然后,在阅读了一些关于它之后,我的问题如下:对你来说,唯一索引不是超键的原因是什么?
  • 候选键/超级键是很少与 RDBMS 实现相关的数据建模术语。 Superkey 是什么意思?
  • 也许这个问题更适合 dba.stackexchange.com
  • @Songo: Superkey vs Candidate key 没问题,有据可查。

标签: mysql sql


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2012-05-21
    • 1970-01-01
    • 1970-01-01
    • 2011-04-30
    • 2011-04-06
    • 2013-10-29
    • 2011-10-20
    • 1970-01-01
    • 2012-08-19
    相关资源
    最近更新 更多