Ключи SQL, MUL против PRI против UNI

249

В чем разница 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    |       | 
+-----------+---------+------+-----+---------+-------+
themaestro
источник

Ответы:

158

Это означает, что поле является (частью) неуникальным индексом. Вы можете оформить

show create table <table>;

Чтобы увидеть больше информации о структуре таблицы.

Мэтт Хили
источник
2
Если это поле (часть) неуникального индекса, то почему оно MULотображается только для этого столбца, а не для всех других столбцов?
Викас Гоэль
1
Там не обязательно какие-либо другие столбцы участвуют. Неуникальное просто означает, что одно и то же значение может встречаться в этом столбце более одного раза .
pgoetz
426
DESCRIBE <table>; 

Это на самом деле сокращение для:

SHOW COLUMNS FROM <table>;

В любом случае, есть три возможных значения для атрибута «Ключ»:

  1. PRI
  2. UNI
  3. MUL

Смысл PRIи UNIвполне понятен

  • PRI => первичный ключ
  • UNI => уникальный ключ

Третья возможность MUL(о которой вы спрашивали) - это индекс, который не является ни первичным, ни уникальным ключом. Название происходит от «множественного», потому что допускается многократное вхождение одного и того же значения. Прямо из документации MySQL :

Если Keyэто так MUL, столбец является первым столбцом неуникального индекса, в котором разрешены множественные вхождения данного значения в столбце.

Также есть последнее предупреждение:

Если более чем один из ключевых значений относится к данной колонке таблицы, ключ отображает один с наивысшим приоритетом, в порядке PRI, UNI, MUL.

Как общее примечание, документация MySQL довольно хорошая. Если есть сомнения, проверьте это!

robguinness
источник
3
«Первичные ключи должны содержать уникальные значения». w3schools.com/sql/sql_primarykey.asp
ktm5124
6
Можно ли в некоторых случаях сказать, что MUL означает, что ключ является внешним ключом ??
Армель Ларсье
5
@robguinness, документация MySQL читается так, как будто она написана не на английском языке. Много раз они брали 3 строки, чтобы объяснить, что можно сделать с 1 строкой.
Pacerier
12
Также Обратите внимание , что таблица с внешней ключ, первичный ключ ссылается на другой таблицы является MUL.
Pacerier
1
@ spacerier, я согласен с вами относительно подробности документации MySQL. Вот почему Stackoverflow обычно первое место, которое я проверяю, особенно если я спешу. ;-)
ограбление
86

Хотя, что такое MUL, PRI и UNI в MySQL?

Из документации MySQL 5.7 :

  • Если Key равен PRI, столбец является PRIMARY KEY или является одним из столбцов в PRIMARY KEY с несколькими столбцами.
  • Если 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)

Таблица с одним столбцом и индексом по одному столбцу имеет 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)

Вставьте это в свой неокортекс и установите диск на «фраппе».

Эрик Лещинский
источник
6

Для Мул это было также полезным документом для меня - http://grokbase.com/t/mysql/mysql/9987k2ew41/key-field-mul-newbie-question

«MUL означает, что ключ позволяет нескольким строкам иметь одно и то же значение. То есть это не UNIque-ключ».

Например, предположим, у вас есть две модели, Post и Comment. Сообщение имеет отношение has_many с комментарием. Тогда для таблицы «Комментарии» имеет смысл иметь ключ MUL (идентификатор сообщения), поскольку многие комментарии можно отнести к одному и тому же сообщению.

committedandroider
источник
4
если это просто не УНИКАЛЬНЫЙ ключ, почему явно упоминается как MUL? По умолчанию это не уникально, не так ли? или я что-то упустил?
Судип Бхандари
@SudipBhandari, если вы устанавливаете индекс для поля, которое не является ни первичным, ни уникальным, тогда MySQL устанавливает тип ключа как MUL, в дополнение к вышеприведенному объяснению, такого рода типы помогают MySQL понять, с каким индексом он имеет дело.
Аднан