Clés SQL, MUL vs PRI vs UNI

247

Quelle est la différence entre MUL, PRIet UNIMySQL?

Je travaille sur une requête MySQL, en utilisant la commande:

desc mytable; 

L'un des champs est indiqué comme étant une MULclé, d'autres apparaissent comme UNIou PRI.

Je sais que si une clé est PRI, un seul enregistrement par table peut être associé à cette clé. Si une clé est MUL, cela signifie-t-il qu'il pourrait y avoir plus d'un enregistrement associé?

Voici la réponse de mytable.

+-----------+---------+------+-----+---------+-------+
| Field     | Type    | Null | Key | Default | Extra |
+-----------+---------+------+-----+---------+-------+
| courseid  | int(11) | YES  | MUL | NULL    |       | 
| dept      | char(3) | YES  |     | NULL    |       | 
| coursenum | char(4) | YES  |     | NULL    |       | 
+-----------+---------+------+-----+---------+-------+
le chef d'orchestre
la source

Réponses:

158

Cela signifie que le champ fait (partie de) un index non unique. Vous pouvez émettre

show create table <table>;

Pour voir plus d'informations sur la structure de la table.

Matt Healy
la source
2
Si ce champ fait (partie de) un index non unique, alors pourquoi MULs'affiche- t -il uniquement sur cette colonne et pas sur toutes les autres colonnes?
Vikas Goel
1
Il n'y a pas nécessairement d'autres colonnes impliquées. Non unique signifie simplement que la même valeur peut apparaître plusieurs fois dans cette colonne .
pgoetz
424
DESCRIBE <table>; 

Il s'agit en fait d'un raccourci pour:

SHOW COLUMNS FROM <table>;

Dans tous les cas, il existe trois valeurs possibles pour l'attribut "Clé":

  1. PRI
  2. UNI
  3. MUL

Le sens de PRIet UNIsont assez clairs:

  • PRI => clé primaire
  • UNI => clé unique

La troisième possibilité, MUL(que vous avez posée) est essentiellement un index qui n'est ni une clé primaire ni une clé unique. Le nom vient de "multiple" car plusieurs occurrences de la même valeur sont autorisées. Directement à partir de la documentation MySQL :

Si Keyc'est le cas MUL, la colonne est la première colonne d'un index non unique dans laquelle plusieurs occurrences d'une valeur donnée sont autorisées dans la colonne.

Il y a aussi une dernière mise en garde:

Si plus d'une des valeurs clés s'applique à une colonne donnée d'une table, touche affiche l'une avec la plus haute priorité, dans l'ordre PRI, UNI, MUL.

De manière générale, la documentation MySQL est assez bonne. En cas de doute, vérifiez!

robguinness
la source
3
"Les clés primaires doivent contenir des valeurs uniques." w3schools.com/sql/sql_primarykey.asp
ktm5124
6
Est-il possible de dire, dans certains contextes, que MUL signifie que la clé est une clé étrangère ??
Armel Larcier
5
@robguinness, la documentation MySQL se lit comme si elle était écrite en non anglais. Plusieurs fois, ils prenaient 3 lignes pour expliquer quelque chose qui pouvait être fait avec 1 ligne.
Pacerier
12
Notez également qu'une table avec une clé étrangère qui fait référence à la clé primaire d'une autre table est MUL.
Pacerier
1
@pacerier, je suis d'accord avec vous concernant la verbosité de la documentation MySQL. C'est pourquoi Stackoverflow est généralement le premier endroit où je vérifie, surtout si je suis pressé. ;-)
robguinness
86

Bien que ce soit MUL, PRI et UNI dans MySQL?

De la documentation MySQL 5.7 :

  • Si la clé est PRI, la colonne est une CLÉ PRIMAIRE ou l'une des colonnes d'une CLÉ PRIMAIRE à plusieurs colonnes.
  • Si Key est UNI, la colonne est la première colonne d'un index UNIQUE. (Un index UNIQUE autorise plusieurs valeurs NULL, mais vous pouvez savoir si la colonne autorise NULL en vérifiant le champ Null.)
  • Si Key est MUL, la colonne est la première colonne d'un index non unique dans laquelle plusieurs occurrences d'une valeur donnée sont autorisées dans la colonne.

Exemples en direct

Groupe de contrôle, cet exemple n'a ni PRI, MUL, ni 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)

Une table avec une colonne et un index sur une colonne a 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)

Une table avec une colonne qui est une clé primaire a 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)

Une table avec une colonne qui est une clé unique a 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)

Une table avec un index couvrant foo et bar a MUL uniquement sur 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)

Une table avec deux index séparés sur deux colonnes a MUL pour chacun

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)

Une table avec un index couvrant trois colonnes a MUL sur la première:

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)

Une table avec une clé étrangère qui fait référence à la clé primaire d'une autre table est 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)

Collez-le dans votre néocortex et réglez le cadran sur "frappe".

Eric Leschinski
la source
6

Pour Mul, cette documentation m'a également été utile - http://grokbase.com/t/mysql/mysql/9987k2ew41/key-field-mul-newbie-question

"MUL signifie que la clé permet à plusieurs lignes d'avoir la même valeur. Autrement dit, ce n'est pas une clé UNIque."

Par exemple, supposons que vous ayez deux modèles, Post et Comment. Le message a une relation has_many avec Commentaire. Il serait alors logique que la table Comment ait une clé MUL (Identifiant de publication) car de nombreux commentaires peuvent être attribués à la même publication.

engagéetroider
la source
4
si ce n'est tout simplement pas une clé UNIQUE, pourquoi mentionner explicitement comme MUL? Par défaut, ce n'est pas UNIQUE de toute façon, n'est-ce pas? ou est-ce que je manque quelque chose?
Sudip Bhandari
@SudipBhandari si vous définissez l'index sur un champ qui n'est ni principal ni unique, alors MySQL définit le type de clé comme MUL, en plus de l'explication ci-dessus, ce type de types aide MySQL à comprendre de quel type d'index il s'agit.
Adnan