SQLキー、MUL対PRI対UNI


247

違いは何ですかMULPRIUNIMySQLでは?

次のコマンドを使用して、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    |       | 
+-----------+---------+------+-----+---------+-------+

回答:


158

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

show create table <table>;

テーブル構造の詳細を表示します。


2
そのフィールドが一意でないインデックス(の一部)である場合、なぜMULその列のみに対して表示され、他のすべての列に対しても表示されないのですか?
Vikas Goel

1
他の列が含まれているとは限りません。非一意とは、その列で同じ値が複数回発生する可能性があることを意味します
pgoetz

424
DESCRIBE <table>; 

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

SHOW COLUMNS FROM <table>;

いずれの場合も、「キー」属性には3つの可能な値があります。

  1. PRI
  2. UNI
  3. MUL

PRIおよびの意味UNIは非常に明確です。

  • PRI =>主キー
  • UNI =>一意のキー

3番目の可能性、MUL(あなたが尋ねた)は、基本的には主キーでも一意キーでもないインデックスです。同じ値の複数の出現が許可されるため、名前は「複数」に由来します。MySQLドキュメントから直接

場合KeyでありMUL、カラムは、与えられた値の複数の発生は、カラム内許可されたユニーク索引の最初の列です。

最後の警告もあります:

キー値の2つ以上が、テーブルの特定の列に適用される場合は、キーの順序で、最も優先順位の高いものを表示しPRIUNIMUL

一般的な注意として、MySQLのドキュメントは非常に優れています。疑問がある場合は、チェックしてください!


3
「主キーには一意の値が含まれている必要があります。」w3schools.com/sql/sql_primarykey.asp
ktm5124

6
一部のコンテキストでは、MULはキーが外部キーであることを意味すると言えるでしょうか?
Armel Larcier 2013

4
@ robguinness、MySQLのドキュメントは英語以外で書かれたように読みます。多くの場合、1行で実行できることを説明するのに3行かかります。
Pacerier、2015

12
また、テーブルとことに注意してください外国キーを参照する別のテーブルの主キーがあることです。MUL
Pacerier 2015

@ pacerier、MySQLのドキュメントの冗長性については同意します。そのため、特に急いでいる場合は特に、Stackoverflowが最初にチェックアウトされる場所です。;-)
robguinness

86

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)

それを新皮質に貼り付け、ダイヤルを「フラッペ」に設定します。


6

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

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

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


4
それが単に一意のキーではない場合、なぜ明示的にMULとして言及するのですか?とにかくデフォルトでは一意ではありませんね。または私は何かを逃していますか?
Sudip Bhandari

@SudipBhandariプライマリまたは一意でないフィールドにインデックスを設定すると、MySQLはキータイプをMULとして設定します。上記の説明に加えて、このようなタイプは、MySQLがどのような種類のインデックスを処理しているかを理解するのに役立ちます。
Adnan
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.