-> id INT,
-> nombre CHAR(19),
-> PRIMARY KEY (nombre));
Query OK, 0 rows affected (0.09 sec)
Los índices sirven para optimizar las consultas y las búsquedas de datos. Mediante su uso es mucho más
rápido localizar filas con determinados valores de columnas, o seguir un determinado orden. La
alternativa es hacer búsquedas secuenciales, que en tablas grandes requieren mucho tiempo.
Claves foráneas
En MySQL sólo existe soporte para claves foráneas en tablas de tipo InnoDB. Sin embargo, esto no
impide usarlas en otros tipos de tablas.
La diferencia consiste en que en esas tablas no se verifica si una clave foránea existe realmente en la
tabla referenciada, y que no se eliminan filas de una tabla con una definición de clave foránea. Para
hacer esto hay que usar tablas InnoDB.
El primero, sólo sirve para documentar, y, al menos en las pruebas que he hecho, no define realmente
claves foráneas. Esta forma consiste en definir una referencia al mismo tiempo que se define una
columna:
mysql>
Hemos usado una definición de referencia para la columna 'id' de la tabla 'telefonos', indicando que es
una clave foránea correspondiente a la columna 'id' de la tabla 'personas' (1). Sin embargo, aunque la
sintaxis se comprueba, esta definición no implica ningún comportamiento por parte de MySQL.
La otra forma es mucho más útil, aunque sólo se aplica a tablas InnoDB.
El ejemplo anterior, usando tablas InnoDB y esta definición de claves foráneas quedará así:
mysql>
Es imprescindible que la columna que contiene una definición de clave foránea esté indexada (2). Pero
esto no debe preocuparnos demasiado, ya que si no lo hacemos de forma explícita, MySQL lo hará por
nosotros de forma implícita.
Esta forma define una clave foránea en la columna 'id', que hace referencia a la columna 'id' de la tabla
'personas' (3). La definición incluye las tareas a realizar en el caso de que se elimine una fila en la tabla
'personas'.
ON DELETE <opción>, indica que acciones se deben realizar en la tabla actual si se borra una fila en
la tabla referenciada.
Existen cinco opciones diferentes. Veamos lo que hace cada una de ellas:
● RESTRICT: esta opción impide eliminar o modificar filas en la tabla referenciada si existen
filas con el mismo valor de clave foránea.
● CASCADE: borrar o modificar una clave en una fila en la tabla referenciada con un valor
determinado de clave, implica borrar las filas con el mismo valor de clave foránea o modificar los
valores de esas claves foráneas.
● SET NULL: borrar o modificar una clave en una fila en la tabla referenciada con un valor
determinado de clave, implica asignar el valor NULL a las claves foráneas con el mismo valor.
● NO ACTION: las claves foráneas no se modifican, ni se eliminan filas en la tabla que las
contiene.
● SET DEFAULT: borrar o modificar una clave en una fila en la tabla referenciada con un valor
determinado implica asignar el valor por defecto a las claves foráneas con el mismo valor.
mysql>
Si se intenta borrar una fila de 'personas' con un determinado valor de 'id', se producirá un error si
existen filas en la tabla 'telefonos3' con mismo valor en la columna 'id'. La fila de 'personas' no se
eliminará, a no ser que previamente eliminemos las filas con el mismo valor de clave foránea en
'teléfonos3'.
Si se modifica el valor de la columna 'id' en la tabla 'personas', se modificarán los valores de la columna
'id' para mantener la relación.
personas
id nombre fecha
1 Fulanito 1998/04/14
2 Menganito 1975/06/18
3 Tulanito 1984/07/05
telefonos3
numero id
12322132 1
12332221 1
55546545 3
55565445 3
Si intentamos borrar la fila correspondiente a "Fulanito" se producirá un error, ya que existen dos filas
en 'telefonos' con el valor 1 en la columna 'id'.
Sí será posible borrar la fila correspondiente a "Menganito", ya que no existe ninguna fila en la tabla
'telefonos' con el valor 2 en la columna 'id'.
Si modificamos el valor de 'id' en la fila correspondiente a "Tulanito", por el valor 4, por ejemplo, se
asignará el valor 4 a la columna 'id' de las filas 3ª y 4ª de la tabla 'telefonos3':
personas
id nombre fecha
1 Fulanito 1998/04/14
2 Menganito 1975/06/18
4 Tulanito 1984/07/05
telefonos3
numero id
12322132 1
12332221 1
55546545 4
55565445 4
No hemos usado todas las opciones. Las opciones de MATCH FULL, MATCH PARTIAL o MATCH
SIMPLE no las comentaremos de momento (lo dejaremos para más adelante).
La parte opcional CONSTRAINT [símbolo] sirve para asignar un nombre a la clave foránea, de modo
que pueda usarse como identificador si se quiere modificar o eliminar una definición de clave foránea.