Ответ 1
Это означает, что поле является (частью) не уникальным индексом. Вы можете указать
show create table <table>;
Чтобы просмотреть дополнительную информацию о структуре таблицы.
В чем разница между MUL
, PRI
и UNI
в MySQL?
Я работаю над запросом MySQL, используя команду:
desc mytable;
Одно из полей отображается как клавиша MUL
, другие - как UNI
или PRI
.
Я знаю, что если ключом является PRI
, с этим ключом может быть связана только одна запись на таблицу. Если ключ 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>;
В любом случае для атрибута "Ключ" есть три возможных значения:
PRI
UNI
MUL
Смысл PRI
и UNI
вполне понятен:
PRI
=> первичный ключUNI
=> уникальный ключТретья возможность, MUL
(о которой вы спрашивали), в основном представляет собой индекс, который не является ни первичным, ни уникальным ключом. Название происходит от "множественного", потому что допускается многократное вхождение одного и того же значения. Прямо из документации MySQL:
Если
Key
равенMUL
, столбец является первым столбцом неуникального индекса, в котором допустимы множественные вхождения данного значения в столбце.
Существует также последнее предупреждение:
Если к данному столбцу таблицы применяется более одного значения Key, Key отображает значение с наивысшим приоритетом в порядке
PRI
,UNI
,MUL
.
Как общее примечание, документация MySQL довольно хорошая. Если есть сомнения, проверьте это!
Из MySQL 5.7 документация:
- Если ключ является PRI, столбец является PRIMARY KEY или является одним из столбцов в нескольких столбцах PRIMARY KEY.
- Если ключ UNI, столбец является первым столбцом индекса UNIQUE. (Индекс UNIQUE допускает несколько значений NULL, но вы можете определить, разрешает ли столбцу NULL, проверяя поле Null.)
- Если ключ является 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)
Таблица с одним столбцом и индексом в одном столбце имеет 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, имеет MUL только для foo:
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)
Таблица с двумя отдельными индексами в двух столбцах имеет 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)
Таблица с индексом, охватывающим три столбца, имеет 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.
Например, скажем, у вас две модели: "Почта" и "Комментарий". Сообщение имеет отношения has_many с комментарием. Тогда было бы целесообразно, чтобы таблица Comment имела ключ MUL (Post id), поскольку многие комментарии могут быть отнесены к одной и той же Почте.
Это означает, что может быть только одна комбинация клавиш.
Так, например, если у вас есть таблица с первичным ключом (product_id, sequence_id), вы можете иметь несколько product_id 15s, несколько sequence_id 20, но только один набор (product_id, sequence_id) = (15, 20)