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 | |
+-----------+---------+------+-----+---------+-------+
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.
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":
Le sens de PRI et de UNI est assez clair:
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
estMUL
, 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!
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.
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".
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.