Ключи SQL, MUL против PRI против UNI - PullRequest
215 голосов
/ 15 марта 2011

В чем разница между 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    |       | 
+-----------+---------+------+-----+---------+-------+

Ответы [ 4 ]

383 голосов
/ 07 марта 2013
DESCRIBE <table>; 

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

SHOW COLUMNS FROM <table>;

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

  1. PRI
  2. UNI
  3. MUL

Значение PRI и UNI совершенно ясно:

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

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

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

Существует также последнее предупреждение:

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

.

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

137 голосов
/ 16 марта 2011

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

show create table <table>;

Для просмотра дополнительной информации о структуре таблицы.

74 голосов
/ 03 августа 2014

Пройдемся по MUL, PRI и UNI в MySQL?

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

  • Если Ключ равен PRI, столбец является ПЕРВИЧНЫМ КЛЮЧОМ или является одним из столбцов в ПЕРВИЧНОМ КЛЮЧЕ с несколькими столбцами.
  • Если ключом является 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".

6 голосов
/ 07 сентября 2015

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...