345 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; 

Un des champs est indiqué comme étant une clé MUL, les autres apparaissent comme UNI ou PRI.

Je sais que si une clé est PRI, seulement un enregistrement par table peut être associé à cette clé. Si une clé est MUL, est-ce que cela signifie qu'il pourrait y avoir plusieurs enregistrements associés?

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    |       | 
+-----------+---------+------+-----+---------+-------+

535voto

robguinness Points 2829
DECRIRE ; 
Il s'agit en réalité d'un raccourci pour :AFFICHER LES COLONNES DE 

;
Quoi qu'il en soit, il existe trois valeurs possibles pour l'attribut "Key" :
PRI
UNI
MUL
La signification de PRI et UNI est assez claire :
PRI => clé primaire
UNI => clé unique
La troisième possibilité, MUL, (à propos de laquelle vous avez demandé) 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 de la documentation MySQL :
  Si Key est MUL, la colonne est la première colonne d'un index non unique dans lequel plusieurs occurrences d'une valeur donnée sont autorisées dans la colonne.
Il y a aussi une dernière mise en garde :
  Si plusieurs des valeurs de clé s'appliquent à une colonne donnée d'une table, Key affiche celle ayant la priorité la plus élevée, dans l'ordre PRI, UNI, MUL.
En général, la documentation MySQL est assez bonne. En cas de doute, consultez-la!

6 votes

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

14 votes

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

7 votes

@robguinness, La documentation MySQL semble écrite par des non-anglophones. Bien des fois, ils utilisent 3 lignes pour expliquer ce qui pourrait être fait en 1 ligne.

202voto

matthewh Points 4104

Cela signifie que le champ fait partie d'un index non unique. Vous pouvez exécuter

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

3 votes

Si ce champ fait partie d'un index non unique, pourquoi MUL s'affiche-t-il uniquement pour cette colonne et pas pour toutes les autres colonnes également ?

4 votes

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

0 votes

La réponse de robguinness est la réponse la plus directe à la question, cette réponse est la plus utile pour vous aider à obtenir toutes les informations dont vous avez besoin.

114voto

Eric Leschinski Points 14289

Walkthough on what is MUL, PRI and UNI in MySQL?

From the documentation MySQL 5.7:

  • If Key is PRI, the column is a PRIMARY KEY or is one of the columns in a multiple-column PRIMARY KEY.
  • If Key is UNI, the column is the first column of a UNIQUE index. (A UNIQUE index permits multiple NULL values, but you can tell whether the column permits NULL by checking the Null field.)
  • If Key is MUL, the column is the first column of a nonunique index in which multiple occurrences of a given value are permitted within the column.

Live Examples

Control group, this example has neither PRI, MUL, nor 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)

A table with one column and an index on the one column has a 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)

A table with a column that is a primary key has 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)

A table with a column that is a unique key has 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)

A table with an index covering foo and bar has MUL only on 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)

A table with two separate indexes on two columns has MUL for each one

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)

A table with an Index spanning three columns has MUL on the first:

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)

A table with a foreign key that references another table's primary key is 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)

Stick that in your neocortex and set the dial to "frappe".

11voto

committedandroider Points 5810

Pour Mul, cela a également été 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, ce n'est pas 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 donc logique que la table Comment ait une clé MUL (id Post) car de nombreux commentaires peuvent être attribués au même Post.

7 votes

Si ce n'est pas juste 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 rate quelque chose?

1 votes

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

1voto

fnizami Points 75

UNI: Pour UNIQUE:

  • C'est un ensemble d'une ou plusieurs colonnes d'une table pour identifier de manière unique l'enregistrement.
  • Une table peut avoir plusieurs clés UNIQUE.
  • C'est assez similaire à une clé primaire pour permettre des valeurs uniques mais peut accepter une valeur nulle que la clé primaire ne peut pas.

PRI: Pour PRIMAIRE:

  • C'est aussi un ensemble d'une ou plusieurs colonnes d'une table pour identifier de manière unique l'enregistrement.
  • Une table ne peut avoir qu'une seule clé PRIMAIRE.
  • C'est assez similaire à une clé UNIQUE pour permettre des valeurs uniques mais n'autorise pas de valeur nulle.

MUL: Pour MULTIPLE:

  • C'est aussi un ensemble d'une ou plusieurs colonnes d'une table qui n'identifie pas de manière unique l'enregistrement.
  • Une table peut avoir plusieurs clés MULTIPLES.
  • Il peut être créé dans une table sur un index ou une clé étrangère, il n'accepte pas de valeur nulle.
  • Il autorise des entrées en double dans la colonne.
  • Si nous ne spécifions pas le type de colonne MUL alors c'est assez similaire à une colonne normale mais peut permettre des entrées nulles, donc pour restreindre de telles entrées nous devons le spécifier.
  • Si nous ajoutons des index sur une colonne ou ajoutons une clé étrangère alors le type de clé MUL est automatiquement 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