Klucze SQL, MUL vs PRI vs UNI


247

Jaka jest różnica między MUL, PRIa UNIw MySQL?

Pracuję nad zapytaniem MySQL, używając polecenia:

desc mytable; 

Jedno z pól jest pokazane jako MULklucz, inne pojawiają się jako UNIlub PRI.

Wiem, że jeśli klucz jest PRI, tylko jeden rekord na tabelę może być powiązany z tym kluczem. Jeśli klucz jest MUL, czy to oznacza, że ​​może istnieć więcej niż jeden powiązany rekord?

Oto odpowiedź mytable.

+-----------+---------+------+-----+---------+-------+
| Field     | Type    | Null | Key | Default | Extra |
+-----------+---------+------+-----+---------+-------+
| courseid  | int(11) | YES  | MUL | NULL    |       | 
| dept      | char(3) | YES  |     | NULL    |       | 
| coursenum | char(4) | YES  |     | NULL    |       | 
+-----------+---------+------+-----+---------+-------+

Odpowiedzi:


158

Oznacza to, że pole jest (częścią) indeksu nieunikalnego. Możesz wystawić

show create table <table>;

Aby zobaczyć więcej informacji o strukturze tabeli.


2
Jeśli to pole jest (częścią) indeksu nieunikalnego, to dlaczego MULpokazuje się tylko w tej kolumnie, a nie we wszystkich innych kolumnach?
Vikas Goel

1
Niekoniecznie są zaangażowane inne kolumny. Nieunikalny oznacza po prostu, że ta sama wartość może wystąpić więcej niż raz w tej kolumnie .
pgoetz

424
DESCRIBE <table>; 

Jest to skrót do:

SHOW COLUMNS FROM <table>;

W każdym razie istnieją trzy możliwe wartości atrybutu „Klucz”:

  1. PRI
  2. UNI
  3. MUL

Znaczenie PRIi UNIsą dość jasne:

  • PRI => klucz podstawowy
  • UNI => unikalny klucz

Trzecia możliwość, MUL(o którą pytałeś) to w zasadzie indeks, który nie jest ani kluczem podstawowym, ani kluczem unikalnym. Nazwa pochodzi od „wielokrotnego”, ponieważ dozwolone jest wiele wystąpień o tej samej wartości. Prosto z dokumentacji MySQL :

Jeśli Keytak MUL, kolumna jest pierwszą kolumną nieunikalnego indeksu, w której dozwolone jest wielokrotne wystąpienie danej wartości w kolumnie.

Istnieje również ostatnie zastrzeżenie:

Jeśli więcej niż jedna z kluczowych wartości odnosi się do danej kolumnie tabeli, Key wyświetla jeden z najwyższym priorytetem, w kolejności PRI, UNI, MUL.

Ogólnie rzecz biorąc, dokumentacja MySQL jest całkiem dobra. W razie wątpliwości sprawdź to!


3
„Klucze podstawowe muszą zawierać unikalne wartości.” w3schools.com/sql/sql_primarykey.asp
ktm5124

6
Czy można powiedzieć w niektórych kontekstach, że MUL oznacza, że ​​klucz jest kluczem obcym?
Armel Larcier

5
@robguinness, dokumentacja MySQL brzmi jak napisana w języku innym niż angielski. Wiele razy zajmowali 3 wiersze, aby wyjaśnić coś, co można zrobić za pomocą 1 wiersza.
Pacerier,

12
Należy również zauważyć, że tabela z pomocą obcego klucza klucz podstawowy Referencje innej tabeli za to MUL.
Pacerier,

1
@pacerier, zgadzam się z tobą w kwestii szczegółowości dokumentacji MySQL. Właśnie dlatego Stackoverflow jest zazwyczaj pierwszym miejscem, w którym sprawdzam, szczególnie jeśli mi się spieszy. ;-)
robguinness

86

Zastanawiasz się, co to jest MUL, PRI i UNI w MySQL?

Z dokumentacji MySQL 5.7 :

  • Jeśli kluczem jest PRI, kolumna jest KLUCZEM PODSTAWOWYM lub jedną z kolumn w KLUCZOWYM KLUCZU PODSTAWOWYM.
  • Jeśli klucz to UNI, kolumna jest pierwszą kolumną indeksu UNIQUE. (Indeks UNIKALNY dopuszcza wiele wartości NULL, ale można stwierdzić, czy kolumna zezwala na NULL, zaznaczając pole Null).
  • Jeśli kluczem jest MUL, kolumna jest pierwszą kolumną z niepowtarzalnym indeksem, w której dozwolone jest wielokrotne wystąpienie danej wartości w kolumnie.

Przykłady na żywo

Grupa kontrolna, w tym przykładzie nie ma ani PRI, MUL ani 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)

Tabela z jedną kolumną i indeksem w jednej kolumnie ma 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)

Tabela z kolumną, która jest kluczem podstawowym, ma 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)

Tabela z kolumną, która jest unikalnym kluczem, ma 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)

Tabela z indeksem obejmującym foo i pasek ma MUL tylko na 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)

Tabela z dwoma oddzielnymi indeksami w dwóch kolumnach ma MUL dla każdej z nich

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)

Tabela z indeksem obejmującym trzy kolumny ma MUL na pierwszej:

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)

Tabela z kluczem obcym, który odwołuje się do klucza podstawowego innej tabeli, to 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)

Trzymaj to w korze nowej i ustaw pokrętło na „frappe”.


6

Dla Mul była to dla mnie także pomocna dokumentacja - http://grokbase.com/t/mysql/mysql/9987k2ew41/key-field-mul-newbie-question

„MUL oznacza, że ​​klucz pozwala wielu wierszom mieć tę samą wartość. Oznacza to, że nie jest to unikalny klucz.”

Załóżmy na przykład, że masz dwa modele: Publikuj i Komentuj. Wpis ma związek z komentarzem. Sensowne byłoby wówczas, aby tabela komentarzy zawierała klucz MUL (identyfikator posta), ponieważ wiele komentarzy można przypisać do tego samego postu.


4
jeśli po prostu nie jest to WYJĄTKOWY klucz, po co wyraźnie wymieniać jako MUL? Domyślnie i tak nie jest WYJĄTKOWY, prawda? czy coś mi brakuje?
Sudip Bhandari,

@SudipBhandari, jeśli ustawisz indeks na polu, które nie jest ani pierwotne, ani unikalne, to MySQL ustawia typ klucza jako MUL. Oprócz powyższych wyjaśnień, tego rodzaju typy pomagają MySQL zrozumieć, z jakim indeksem ma do czynienia.
Adnan,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.