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


247

У чому різниця між 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    |       | 
+-----------+---------+------+-----+---------+-------+

Відповіді:


158

Це означає, що поле є (частиною) не унікальним індексом. Ви можете видавати

show create table <table>;

Щоб побачити більше інформації про структуру таблиці.


2
Якщо це поле є (частиною) не унікальним індексом, то чому він MULпоказує лише цей стовпець, а не всі інші стовпці.?
Вікас Гоел

1
Не обов’язково включаються інші стовпці. Не унікальне просто означає, що одне і те ж значення може виникати не один раз у цьому стовпці .
pgoetz

424
DESCRIBE <table>; 

Це гостро ярлик для:

SHOW COLUMNS FROM <table>;

У будь-якому випадку для атрибута "Ключ" є три можливі значення:

  1. PRI
  2. UNI
  3. MUL

Сенс PRIі UNIдосить зрозумілий:

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

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

Якщо Keyце так MUL, то стовпець - це перший стовпець невідповідного індексу, в якому в стовпці дозволено кілька входів заданого значення.

Існує також остаточне застереження:

Якщо більш ніж один з ключових значень відноситься до даної колонці таблиці, ключ відображає один з найвищим пріоритетом, в порядку PRI, UNI, MUL.

Як загальне зауваження, документація на MySQL є досить хорошою. Якщо ви сумніваєтесь, перевірте це!


3
"Первинні ключі повинні містити унікальні значення." w3schools.com/sql/sql_primarykey.asp
ktm5124

6
Чи можливо в деяких контекстах сказати, що MUL означає, що ключ є зовнішнім ключем ??
Армель Ларсьє

5
@robguinness, документація на MySQL така, що написана не англійською мовою. Багато разів вони займуть 3 рядки, щоб пояснити щось, що можна зробити за допомогою 1 рядка.
Pacerier


1
@pacerier, я погоджуюся з вами щодо багатозначності документації на 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

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

"MUL означає, що ключ дозволяє декілька рядків мати однакове значення. Тобто це не ключ UNIque."

Наприклад, скажімо, у вас є дві моделі - "Пост" та "Коментар". Повідомлення має багато стосунків із коментарем. Тоді було б доцільно, щоб у таблиці коментарів був ключ MUL (ідентифікатор публікації), оскільки багато коментарів можна віднести до тієї ж публікації.


4
якщо це просто не УНІКАЛЬНИЙ ключ, навіщо явно згадувати як MUL? За замовчуванням це все-таки НЕ Унікальне, чи не так? чи я щось пропускаю?
Судіп Бхандарі

@SudipBhandari, якщо ви встановите індекс на поле, яке не є первинним, ані унікальним, MySQL встановлює тип ключа як MUL, на додаток до пояснення вище, такі типи допомагають MySQL зрозуміти, з яким індексом він має справу.
Аднан
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.