Claves SQL, MUL vs PRI vs UNI


¿Cuál es la diferencia entre MUL, PRI y UNI en MySQL?

Estoy trabajando en una consulta MySQL, usando el comando:

desc mytable; 

Uno de los campos se muestra como una clave MUL, otros se muestran como UNI o PRI.

Sé que si una clave es PRI, solo se puede asociar un registro por tabla con esa clave. Si una clave es MUL, ¿significa eso 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    |       | 
+-----------+---------+------+-----+---------+-------+
 195
Author: andersonvom, 2011-03-15

4 answers

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

show create table <table>;

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

 128
Author: Matt Healy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-15 21:26:13
DESCRIBE <table>; 

Esto es acutalmente un atajo para:

SHOW COLUMNS FROM <table>;

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

  1. PRI
  2. UNI
  3. MUL

El significado de PRI y UNI es bastante claro:

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

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

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.

También hay una advertencia final:

Si más de uno de los valores Clave se aplica a una columna dada de una tabla, Key muestra la que tiene la prioridad más alta, en el orden PRI, UNI, MUL.

Como nota general, la documentación de MySQL es bastante buena. En caso de duda, échale un vistazo!

 336
Author: robguinness,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-19 16:04:27

Walkthough en lo que es MUL, PRI y UNI en MySQL?

De la documentación de MySQL 5.7 :

  • Si la clave es PRI, la columna es una CLAVE PRIMARIA o es una de las columnas en una CLAVE PRIMARIA de múltiples columnas.
  • Si la clave es UNI, la columna es la primera columna de un índice ÚNICO. (Un índice ÚNICO permite múltiples valores NULL, pero puede saber si la columna permite NULL marcando el campo Null.)
  • Si la clave 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 vivos

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

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 foránea que hace referencia a la clave primaria 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)

Pon eso en tu neocórtex y pon el dial en "frappe".

 64
Author: Eric Leschinski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-19 17:01:20

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, digamos que tienes dos modelos, Post y Comment. Post tiene una relación has_many con el Comentario. Entonces tendría sentido que la tabla de comentarios tenga una clave MUL (Post id) porque muchos comentarios pueden atribuirse a la mismo Post.

 6
Author: committedandroider,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-07 19:48:47