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 | |
+-----------+---------+------+-----+---------+-------+
これは、そのフィールドが非ユニークインデックス(の一部)であることを意味します。あなたが発行することができます
show create table <table>;
テーブル構造に関する詳細情報を見るため。
DESCRIBE <table>;
これは実際には次のショートカットです。
SHOW COLUMNS FROM <table>;
いずれにせよ、 "Key"属性には3つの可能な値があります。
PRIとUNIの意味は明らかです。
3番目の可能性、MUL(あなたが尋ねたもの)は基本的に主キーでもユニークキーでもないインデックスです。同じ値の複数の発生が許可されているので、名前は "multiple"から来ています。 MySQLのドキュメントから直接抜粋したものです 。
Key
がMUL
である場合、その列は一意でないインデックスの最初の列で、その列内では特定の値を複数回使用できます。
最後の注意点もあります。
複数のKey値がテーブルの特定の列に適用される場合、Keyは最も優先順位の高いものを
PRI
、UNI
、MUL
の順に表示します。
一般的な注意として、MySQLのドキュメントはとても良いです。疑問がある場合は、チェックしてください。
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"に設定してください。
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)を持つことは意味があります。