2

次の SQL コードは、2 つのテーブル (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キーの属性 (列) のセットは、k1k2

  • A:{a}{a,b}、それぞれ
  • B:{a}{a}、それぞれ。

これは、MySQL では、一意のキーの概念は候補キー/スーパーk1キーの概念のいずれにも対応しないという結論を示唆していk2ます。 )。ケース (B) の場合、andはスーパーキーにはなりません。これは、同一の属性セットを持つ異なるキーであるためです。{a} ⊂ {a,b}k2k1k2

私の質問: この結論は正しいですか? もしそうなら、どの信頼できる情報源がそれを明確に述べていますか?

4

1 に答える 1

1

あなたが正しいです。SQL では、一意性制約で定義された列のセットは必ずしもキー (最小限のスーパーキー) ではなく、それらの列の適切なサブセットにも一意性制約が設定されている場合は、キーではありません。

標準 SQL とは異なり、MySQL 構文の特異性は、"KEY" を "INDEX" の同義語として使用することです。これは、MySQL の作成者がキーが何であるかを知らないか気にしないことを示唆しているようです!

于 2012-10-03T21:40:29.830 に答える