web-dev-qa-db-ja.com

SQLキー、MUL対PRI対UNI

MySQLにおけるMUL、PRI、およびUNIの違いは何ですか?

私は次のコマンドを使用して、MySQLクエリに取り組んでいます。

desc mytable; 

フィールドの1つはMULキーとして表示され、他のフィールドはUNIまたはPRIとして表示されます。

キーがPRIの場合、そのキーに関連付けることができるのはテーブルごとに1つのレコードだけです。キーがMULの場合、それは複数の関連レコードがある可能性があることを意味しますか?

これがmytableの反応です。

+-----------+---------+------+-----+---------+-------+
| Field     | Type    | Null | Key | Default | Extra |
+-----------+---------+------+-----+---------+-------+
| courseid  | int(11) | YES  | MUL | NULL    |       | 
| dept      | char(3) | YES  |     | NULL    |       | 
| coursenum | char(4) | YES  |     | NULL    |       | 
+-----------+---------+------+-----+---------+-------+
213
themaestro

これは、そのフィールドが非ユニークインデックス(の一部)であることを意味します。あなたが発行することができます

show create table <table>;

テーブル構造に関する詳細情報を見るため。

137
Matt Healy
DESCRIBE <table>; 

これは実際には次のショートカットです。

SHOW COLUMNS FROM <table>;

いずれにせよ、 "Key"属性には3つの可能な値があります。

  1. PRI
  2. UNI
  3. MUL

PRIとUNIの意味は明らかです。

  • PRI =>主キー
  • UNI =>ユニークキー

3番目の可能性、MUL(あなたが尋ねたもの)は基本的に主キーでもユニークキーでもないインデックスです。同じ値の複数の発生が許可されているので、名前は "multiple"から来ています。 MySQLのドキュメントから直接抜粋したものです

KeyMULである場合、その列は一意でないインデックスの最初の列で、その列内では特定の値を複数回使用できます。

最後の注意点もあります。

複数のKey値がテーブルの特定の列に適用される場合、Keyは最も優先順位の高いものをPRIUNIMULの順に表示します。

一般的な注意として、MySQLのドキュメントはとても良いです。疑問がある場合は、チェックしてください。

380
robguinness

MySQLのMUL、PRI、およびUNIとは何ですか?

MySQL 5.7 のドキュメントから:

  • KeyがPRIの場合、列はPRIMARY KEYであるか、または複数列のPRIMARY KEY内の列の1つです。
  • KeyがUNIの場合、その列はUNIQUEインデックスの最初の列です。 (UNIQUEインデックスは複数のNULL値を許可しますが、列がNULLを許可するかどうかはNullフィールドをチェックすることでわかります。)
  • KeyがMULの場合、その列は一意でないインデックスの最初の列で、その列内では特定の値の複数回の出現が許可されます。

実例

コントロールグループ、この例にはPRI、MUL、UNIのいずれもありません。

mysql> create table penguins (foo INT);
Query OK, 0 rows affected (0.01 sec)

mysql> desc penguins;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| foo   | int(11) | YES  |     | NULL    |       |
+-------+---------+------+-----+---------+-------+
1 row in set (0.00 sec)

1つの列と1つの列のインデックスを持つテーブルはMULを持ちます。

mysql> create table penguins (foo INT, index(foo));
Query OK, 0 rows affected (0.01 sec)

mysql> desc penguins;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| foo   | int(11) | YES  | MUL | NULL    |       |
+-------+---------+------+-----+---------+-------+
1 row in set (0.00 sec)

主キーである列を持つテーブルはPRIを持ちます

mysql> create table penguins (foo INT primary key);
Query OK, 0 rows affected (0.02 sec)

mysql> desc penguins;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| foo   | int(11) | NO   | PRI | NULL    |       |
+-------+---------+------+-----+---------+-------+
1 row in set (0.00 sec)

一意キーである列を持つテーブルにはUNIがあります。

mysql> create table penguins (foo INT unique);
Query OK, 0 rows affected (0.01 sec)

mysql> desc penguins;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| foo   | int(11) | YES  | UNI | NULL    |       |
+-------+---------+------+-----+---------+-------+
1 row in set (0.00 sec)

fooとbarをカバーするインデックスを持つテーブルは、fooについてのみMULを持ちます。

mysql> create table penguins (foo INT, bar INT, index(foo, bar));
Query OK, 0 rows affected (0.01 sec)

mysql> desc penguins;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| foo   | int(11) | YES  | MUL | NULL    |       |
| bar   | int(11) | YES  |     | NULL    |       |
+-------+---------+------+-----+---------+-------+
2 rows in set (0.00 sec)

2つの列に2つの別々のインデックスがあるテーブルでは、それぞれにMULがあります

mysql> create table penguins (foo INT, bar int, index(foo), index(bar));
Query OK, 0 rows affected (0.01 sec)

mysql> desc penguins;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| foo   | int(11) | YES  | MUL | NULL    |       |
| bar   | int(11) | YES  | MUL | NULL    |       |
+-------+---------+------+-----+---------+-------+
2 rows in set (0.00 sec)

3列にわたるインデックスを持つテーブルは、最初にMULを持ちます。

mysql> create table penguins (foo INT, 
       bar INT, 
       baz INT, 
       INDEX name (foo, bar, baz));
Query OK, 0 rows affected (0.01 sec)

mysql> desc penguins;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| foo   | int(11) | YES  | MUL | NULL    |       |
| bar   | int(11) | YES  |     | NULL    |       |
| baz   | int(11) | YES  |     | NULL    |       |
+-------+---------+------+-----+---------+-------+
3 rows in set (0.00 sec)

他のテーブルの主キーを参照する外部キーを持つテーブルはMUL

mysql> create table penguins(id int primary key);
Query OK, 0 rows affected (0.01 sec)

mysql> create table skipper(id int, foreign key(id) references penguins(id));
Query OK, 0 rows affected (0.01 sec)

mysql> desc skipper;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id    | int(11) | YES  | MUL | NULL    |       |
+-------+---------+------+-----+---------+-------+
1 row in set (0.00 sec)

mysql> desc penguins;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id    | int(11) | NO   | PRI | NULL    |       |
+-------+---------+------+-----+---------+-------+
1 row in set (0.00 sec)

それをあなたの新皮質に貼り付けて、ダイヤルを "frappe"に設定してください。

71
Eric Leschinski

Mulにとって、これは私にとっても役に立つドキュメントでした - http://grokbase.com/t/mysql/mysql/9987k2ew41/key-field-mul-newbie-question

「MULは、キーが複数の行に同じ値を持つことを許可することを意味します。つまり、UNIqueキーではありません。」

たとえば、PostとCommentの2つのモデルがあるとしましょう。 PostはCommentとhas_manyの関係にあります。多くのコメントが同じPostに起因する可能性があるので、CommentテーブルがMULキー(Post id)を持つことは意味があります。

6