284 votes

Clés SQL, MUL vs PRI vs UNI

Quelle est la différence entre MUL , PRI et UNI dans MySQL ?

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

desc mytable; 

L'un des champs est indiqué comme étant un MUL d'autres apparaissent comme UNI ou 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 peut 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    |       | 
+-----------+---------+------+-----+---------+-------+

461voto

robguinness Points 2829
DESCRIBE <table>; 

C'est en fait un raccourci pour.. :

SHOW COLUMNS FROM <table>;

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

  1. PRI
  2. UNI
  3. MUL

La signification de PRI et UNI sont très claires :

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

La troisième possibilité, MUL (que vous avez demandé) est fondamentalement 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 du Documentation sur MySQL :

Si Key est MUL la colonne est la première colonne d'un index non unique dans lequel les occurrences multiples d'une valeur donnée sont autorisées dans la colonne.

Il y a aussi un dernier avertissement :

Si plusieurs des valeurs de Key s'appliquent à une colonne donnée d'une table, Key affiche celle qui a la plus grande priorité, dans l'ordre suivant PRI , UNI , MUL .

D'une manière générale, la documentation de MySQL est assez bonne. En cas de doute, consultez-la !

3 votes

"Les clés primaires doivent contenir des valeurs uniques." w3schools.com/sql/sql_primarykey.asp

10 votes

Est-il possible de dire, dans certains contextes, que MUL signifie que la clé est une clé étrangère ? ?

5 votes

@robguinness, la documentation MySQL se lit comme si elle était écrite par un non-anglais. Souvent, ils prennent 3 lignes pour expliquer quelque chose qui pourrait être fait en 1 ligne.

180voto

matthewh Points 4104

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

show create table <table>;

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

2 votes

Si ce champ est (une partie de) un index non unique, alors pourquoi est-ce que MUL ne s'affiche que dans cette colonne et pas dans toutes les autres ?

2 votes

Il n'y a pas nécessairement d'autres colonnes impliquées. Non-unique signifie simplement que la même valeur peut apparaître plus d'une fois. dans cette colonne .

96voto

Eric Leschinski Points 14289

Que sont MUL, PRI et UNI dans MySQL ?

De la MySQL 5.7 documentation :

  • Si Key est PRI, la colonne est une PRIMARY KEY ou est l'une des colonnes d'une PRIMARY KEY à colonnes multiples.
  • 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 lequel les occurrences multiples d'une valeur donnée sont autorisées dans la colonne.

Exemples en direct

Groupe de contrôle, cet exemple n'a ni PRI, ni 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 cette 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 un 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 n'a MUL que 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 d'eux

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)

Mets ça dans ton néocortex et règle le cadran sur "frappe".

8voto

committedandroider Points 5810

Pour Mul, c'était aussi une documentation utile pour moi - 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. C'est-à-dire qu'il ne s'agit pas d'une clé UNIque."

Par exemple, disons que vous avez deux modèles, Post et Comment. Post a une relation has_many avec Comment. Il serait alors logique que la table Comment ait une clé MUL (Post id) car de nombreux commentaires peuvent être attribués au même article.

5 votes

s'il ne s'agit pas d'une clé UNIQUE, pourquoi la mentionner explicitement comme MUL ? Par défaut, elle n'est pas UNIQUE de toute façon, n'est-ce pas ? ou est-ce que je rate quelque chose ?

1 votes

@SudipBhandari si vous définissez l'index sur un champ qui n'est ni primaire ni unique, MySQL définit le type de clé comme MUL, en plus de l'explication ci-dessus, ce type de type aide MySQL à comprendre le type d'index avec lequel il travaille.

2voto

fnizami Points 75

UNI : Pour UNIQUE :

  • C'est un ensemble d'une ou plusieurs colonnes d'une table permettant d'identifier de façon unique l'enregistrement.
  • Une table peut avoir plusieurs clés UNIQUE.
  • Comme la clé primaire, elle autorise des valeurs uniques, mais peut accepter une valeur nulle, ce qui n'est pas le cas de la clé primaire. peut accepter une valeur nulle, ce qui n'est pas le cas de la clé primaire.

PRI : Pour PRIMARY :

  • Il s'agit également d'un ensemble d'une ou plusieurs colonnes d'une table permettant d'identifier de manière unique l'enregistrement.
  • Une table ne peut avoir qu'une seule clé PRIMAIRE.
  • C'est un peu comme la clé UNIQUE qui autorise des valeurs uniques mais ne permet pas aucune valeur nulle.

MUL : Pour MULTIPLE :

  • C'est aussi un ensemble d'une ou plusieurs colonnes d'une table qui ne permet pas identifier l'enregistrement de manière unique.
  • Une table peut avoir plus d'une clé MULTIPLE.
  • Il peut être créé dans une table sur l'ajout d'un index ou d'une clé étrangère. pas la valeur nulle.
  • Il autorise les entrées doubles dans la colonne.
  • Si nous ne spécifions pas le type de colonne MUL, alors elle est tout à fait comme une colonne normale. normale, mais elle peut aussi permettre des entrées nulles. nous devons le spécifier.
  • Si nous ajoutons des index sur une colonne ou une clé étrangère, le type de clé MUL est automatiquement ajouté. est ajouté.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X