Chiavi SQL, MUL vs PRI vs UNI


248

Qual è la differenza tra MUL, PRIe UNIin MySQL?

Sto lavorando su una query MySQL, usando il comando:

desc mytable; 

Uno dei campi viene mostrato come MULchiave, altri vengono visualizzati come UNIo PRI.

So che se una chiave è PRI, solo un record per tabella può essere associato a quella chiave. Se una chiave è MUL, significa che potrebbe esserci più di un record associato?

Ecco la risposta di mytable.

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

Risposte:


158

Significa che il campo è (parte di) un indice non univoco. Puoi emettere

show create table <table>;

Per visualizzare ulteriori informazioni sulla struttura della tabella.


2
Se quel campo è (parte di) un indice non univoco, perché viene MULvisualizzato solo su quella colonna e non anche su tutte le altre colonne.
Vikas Goel,

1
Non ci sono necessariamente altre colonne coinvolte. Non univoco significa solo che lo stesso valore può verificarsi più di una volta in quella colonna .
pgoetz,

425
DESCRIBE <table>; 

Questa è una scorciatoia per:

SHOW COLUMNS FROM <table>;

In ogni caso, ci sono tre possibili valori per l'attributo "Chiave":

  1. PRI
  2. UNI
  3. MUL

Il significato di PRIe UNIsono abbastanza chiari:

  • PRI => chiave primaria
  • UNI => chiave univoca

La terza possibilità, MUL(di cui hai chiesto informazioni) è sostanzialmente un indice che non è né una chiave primaria né una chiave univoca. Il nome deriva da "multiple" perché sono consentite più occorrenze dello stesso valore. Direttamente dalla documentazione di MySQL :

Se Keyè MUL, la colonna è la prima colonna di un indice non univoco nel quale i molteplici occorrenze di un determinato valore all'interno della colonna.

C'è anche un avvertimento finale:

Se più di uno dei valori chiave vale per una data colonna di una tabella, il tasto viene visualizzato uno con la massima priorità, nell'ordine PRI, UNI, MUL.

Come nota generale, la documentazione di MySQL è abbastanza buona. In caso di dubbi, dai un'occhiata!


3
"Le chiavi primarie devono contenere valori univoci." w3schools.com/sql/sql_primarykey.asp
ktm5124

6
È possibile dire, in alcuni contesti, che MUL significa che la chiave è una chiave esterna ??
Armel Larcier,

5
@robguinness, la documentazione di MySQL sembra scritta da un non inglese. Molte volte prenderebbero 3 righe per spiegare qualcosa che potrebbe essere fatto con 1 riga.
Pacerier,


1
@pacerier, sono d'accordo con te per quanto riguarda la verbosità della documentazione di MySQL. Ecco perché Stackoverflow è in genere il primo posto che controllo, soprattutto se ho fretta. ;-)
rapina

86

Walkthough su cosa sono MUL, PRI e UNI in MySQL?

Dalla documentazione di MySQL 5.7 :

  • Se Key è PRI, la colonna è una PRIMARY KEY o è una delle colonne in una PRIMARY KEY a più colonne.
  • Se Key è UNI, la colonna è la prima colonna di un indice UNIQUE. (Un indice UNICO consente più valori NULL, ma è possibile stabilire se la colonna consente NULL selezionando il campo Null.)
  • Se Key è MUL, la colonna è la prima colonna di un indice non univoco in cui sono consentite più occorrenze di un determinato valore all'interno della colonna.

Esempi dal vivo

Gruppo di controllo, questo esempio non ha né PRI, MUL, né 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)

Una tabella con una colonna e un indice su una colonna ha un 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)

Una tabella con una colonna che è una chiave primaria ha 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)

Una tabella con una colonna che è una chiave univoca ha 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)

Un tavolo con un indice che copre foo e bar ha MUL solo su 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)

Una tabella con due indici separati su due colonne ha MUL per ognuno

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)

Una tabella con un indice che si estende su tre colonne ha il MUL sul primo:

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)

Una tabella con una chiave esterna che fa riferimento alla chiave primaria di un'altra tabella è 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)

Inseriscilo nella tua neocorteccia e imposta il quadrante su "frappe".


6

Per Mul, questa è stata anche una documentazione utile per me - http://grokbase.com/t/mysql/mysql/9987k2ew41/key-field-mul-newbie-question

"MUL significa che la chiave consente a più righe di avere lo stesso valore. Cioè, non è una chiave UNICA."

Ad esempio, supponiamo che tu abbia due modelli, Pubblica e Commenta. Post ha una relazione has_many con Comment. Avrebbe senso quindi che la tabella dei commenti avesse una chiave MUL (ID post) perché molti commenti possono essere attribuiti allo stesso post.


4
se non è semplicemente una chiave UNICA, perché esplicitamente menzionato come MUL? Di default non è UNICO comunque, no? Oppure mi sfugge qualcosa?
Sudip Bhandari,

@SudipBhandari se si imposta l'indice su un campo che non è né primario né unico, allora MySQL imposta il tipo di chiave come MUL, oltre alla spiegazione sopra, questo tipo di tipi aiuta MySQL a capire con quale tipo di indice si sta occupando.
Adnan,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.