Claves SQL, MUL vs PRI vs UNI

247

¿Cuál es la diferencia entre MUL, PRIy UNIen MySQL?

Estoy trabajando en una consulta MySQL, usando el comando:

desc mytable; 

Uno de los campos se muestra como una MULclave, otros se muestran como UNIo PRI.

Sé que si una clave es PRI, solo se puede asociar un registro por tabla con esa clave. Si una clave es MUL, ¿eso significa que podría haber más de un registro asociado?

Aquí está la respuesta de mytable.

+-----------+---------+------+-----+---------+-------+
| Field     | Type    | Null | Key | Default | Extra |
+-----------+---------+------+-----+---------+-------+
| courseid  | int(11) | YES  | MUL | NULL    |       | 
| dept      | char(3) | YES  |     | NULL    |       | 
| coursenum | char(4) | YES  |     | NULL    |       | 
+-----------+---------+------+-----+---------+-------+
el maestro
fuente

Respuestas:

158

Significa que el campo es (parte de) un índice no único. Puedes emitir

show create table <table>;

Para ver más información sobre la estructura de la tabla.

Matt Healy
fuente
2
Si ese campo es (parte de) un índice no único, entonces ¿por qué MULsolo se muestra en esa columna y no en todas las demás columnas?
Vikas Goel
1
No hay necesariamente ninguna otra columna involucrada. No exclusivo solo significa que el mismo valor puede aparecer más de una vez en esa columna .
pgoetz
424
DESCRIBE <table>; 

Este es un atajo para:

SHOW COLUMNS FROM <table>;

En cualquier caso, hay tres valores posibles para el atributo "Clave":

  1. PRI
  2. UNI
  3. MUL

El significado de PRIy UNIson bastante claros:

  • PRI => clave primaria
  • UNI => clave única

La tercera posibilidad, MUL(sobre la que preguntó) es básicamente un índice que no es una clave primaria ni una clave única. El nombre proviene de "múltiple" porque se permiten múltiples ocurrencias del mismo valor. Directamente de la documentación de MySQL :

Si Keyes así MUL, la columna es la primera columna de un índice no único en el que se permiten múltiples ocurrencias de un valor dado dentro de la columna.

También hay una advertencia final:

Si hay más de uno de los valores clave se aplica a una columna dada de una mesa, pantallas clave el que tiene la más alta prioridad, en el orden PRI, UNI, MUL.

Como nota general, la documentación de MySQL es bastante buena. ¡En caso de duda, comprobar que funciona!

robguinness
fuente
3
"Las claves primarias deben contener valores únicos". w3schools.com/sql/sql_primarykey.asp
ktm5124
66
¿Es posible decir, en algunos contextos, que MUL significa que la clave es una clave externa?
Armel Larcier
55
@robguinness, la documentación de MySQL se lee como si estuviera escrita en otro idioma. Muchas veces tomarían 3 líneas para explicar algo que podría hacerse con 1 línea.
Pacerier
12
También tenga en cuenta que una tabla con una clave externa que hace referencia a la clave principal de otra tabla es MUL.
Pacerier
1
@pacerier, estoy de acuerdo con usted con respecto a la verbosidad de la documentación de MySQL. Es por eso que Stackoverflow suele ser el primer lugar que reviso, especialmente si tengo prisa. ;-)
robguinness
86

¿Piensa en qué es MUL, PRI y UNI en MySQL?

De la documentación de MySQL 5.7 :

  • Si Key es PRI, la columna es una CLAVE PRIMARIA o es una de las columnas de una CLAVE PRIMARIA de columnas múltiples.
  • Si Key es UNI, la columna es la primera columna de un índice UNIQUE. (Un índice ÚNICO permite múltiples valores NULL, pero puede saber si la columna permite NULL marcando el campo NULL).
  • Si Key es MUL, la columna es la primera columna de un índice no único en el que se permiten múltiples ocurrencias de un valor dado dentro de la columna.

Ejemplos en vivo

Grupo de control, este ejemplo no tiene 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)

Una tabla con una columna y un índice en una columna tiene 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)

Una tabla con una columna que es una clave principal tiene 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)

Una tabla con una columna que es una clave única tiene 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)

Una tabla con un índice que cubre foo y bar tiene MUL solo en 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)

Una tabla con dos índices separados en dos columnas tiene MUL para cada una.

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)

Una tabla con un índice que abarca tres columnas tiene MUL en la primera:

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)

Una tabla con una clave externa que hace referencia a la clave principal de otra tabla es 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)

Pegue eso en su neocorteza y ajuste el dial a "frappe".

Eric Leschinski
fuente
6

Para Mul, esta también fue una documentación útil para mí: http://grokbase.com/t/mysql/mysql/9987k2ew41/key-field-mul-newbie-question

"MUL significa que la clave permite que varias filas tengan el mismo valor. Es decir, no es una clave ÚNICA".

Por ejemplo, supongamos que tiene dos modelos, Publicar y Comentar. La publicación tiene una relación has_many con Comentario. Entonces, tendría sentido que la tabla de comentarios tenga una clave MUL (ID de publicación) porque muchos comentarios se pueden atribuir a la misma publicación.

comitendroider
fuente
44
si simplemente no es una clave ÚNICA, ¿por qué mencionarla explícitamente como MUL? Por defecto, no es ÚNICO de todos modos, ¿no? ¿O me estoy perdiendo algo?
Sudip Bhandari
@SudipBhandari si configura el índice en un campo que no es primario ni único, entonces MySQL establece el tipo de clave como MUL, además de la explicación anterior, este tipo de tipos ayuda a MySQL a comprender con qué tipo de índice se trata.
Adnan