SQL-ключи, MUL vs PRI и UNI

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

Ответ 1

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

show create table <table>;

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

Ответ 2

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 довольно хорошая. Если есть сомнения, проверьте это!

Ответ 3

Хотелось бы знать, что такое MUL, PRI и UNI в 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".

Ответ 4

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

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

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

Ответ 5

Это означает, что может быть только одна комбинация клавиш.

Так, например, если у вас есть таблица с первичным ключом (product_id, sequence_id), вы можете иметь несколько product_id 15s, несколько sequence_id 20, но только один набор (product_id, sequence_id) = (15, 20)