web-dev-qa-db-fra.com

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 représenté par la touche MUL, les autres sous la forme 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 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    |       | 
+-----------+---------+------+-----+---------+-------+
221
themaestro

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

show create table <table>;

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

138
Matt Healy
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

Le sens de PRI et de UNI est assez clair:

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

La troisième possibilité, MUL (sur laquelle vous avez posé des questions) 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 du 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 valeurs de clé s'appliquent à une colonne donnée d'une table, Key affiche celle qui a la priorité la plus élevée, dans l'ordre PRI, UNI, MUL.

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

391
robguinness

Sur quoi portent MUL, PRI et UNI dans MySQL?

De la documentation MySQL 5.7 :

  • Si Key est défini sur 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 déterminer si la colonne autorise NULL en cochant le champ Null.)
  • Si Key a la valeur 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.

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 la 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)

Un tableau 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

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 sur 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".

77
Eric Leschinski

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. Autrement dit, il ne s'agit pas d'une clé UNIque."

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

6
committedandroider