¿Conceptos básicos de claves externas en MySQL?

91

¿Hay alguna buena explicación de cómo usar la construcción de clave externa de MySQL?

No lo obtengo de los propios documentos de MySQL. Hasta ahora he estado manejando cosas como claves externas con combinaciones y código de programación.

Y la segunda parte de la pregunta, ¿hay alguna mejora que se pueda realizar al utilizar las claves externas integradas de MySQL?

Macha
fuente

Respuestas:

117

FOREIGN KEYS solo asegúrese de que sus datos sean consistentes.

No mejoran las consultas en términos de eficiencia, solo hacen que algunas consultas incorrectas fallen.

Si tienes una relación como esta:

CREATE TABLE department (id INT NOT NULL)
CREATE TABLE employee (id INT NOT NULL, dept_id INT NOT NULL, FOREIGN KEY (dept_id) REFERENCES department(id))

, entonces no puede eliminar un departmentsi tiene algunos employee.

Si proporciona ON DELETE CASCADEa la FOREIGN KEYdefinición, las filas de referencia se eliminarán automáticamente junto con las referenciadas.

Como restricción, en FOREIGN KEYrealidad ralentiza un poco las consultas.

Es necesario realizar una verificación adicional al eliminar de una tabla de referencia o insertar en una de referencia.

Quassnoi
fuente
1
La ralentización es mínima, porque normalmente hace FK en campos indexados, lo que facilita la búsqueda de los valores relevantes.
Seb
4
Es por eso que escribí "un poco" :) En realidad, si eliminas muchas filas, el subyacente JOINpuede ser mucho menos eficiente que dos DELETE que usan FULL TABLE SCAN
Quassnoi
2
Perdón por el voto en contra. Fue accidental, pero no me permite cambiar mi voto.
Wondercricket
8
@Wondercricket: Ni siquiera sé qué hacer ahora, es un área gris en las reglas del sitio. Creo que me invitas a una cerveza cuando estás en Moscú y estamos empatados.
Quassnoi
1
@stack: cualquier actualización que haga a la clave a la que se hace referencia se conecta en cascada a la tabla de referencia.
Quassnoi
32

Los principales beneficios de usar claves externas reales son garantizar la integridad de los datos y poder configurar acciones en cascada en elementos relacionados cuando algo se modifica o elimina.

Por ejemplo, imagina que estás programando un foro. Tiene una tabla de "temas" con clave principal topics.topic_idy tiene una tabla de "publicaciones" donde las publicaciones se adjuntan a los temas con la columna posts.topic_id, que es una clave externa a la tabla de temas.

Esta relación de clave externa garantiza que cada publicación se adjunte a un tema válido. Si el único tema que tiene tiene ID # 1, es imposible que exista una publicación en la base de datos adjunta al tema # 2. La base de datos asegura esto.

Para el beneficio en cascada, puede configurarlo para que, si se elimina un tema de la tabla de temas, la base de datos elimine automáticamente todas las publicaciones en la tabla de publicaciones que se adjuntaron a este tema. Esto es bueno porque elimina un paso que debe recordar hacer manualmente, que puede volverse bastante complejo cuando tiene muchas tablas vinculadas entre sí. Con las claves externas, todas las relaciones se pueden limpiar automáticamente.

Abedul de Chad
fuente
11

1.FOREIGN KEYS solo asegúrese de que sus datos sean consistentes.

2. Si aplicamos en cascada de eliminación a la definición de clave externa, la fila de referencia se eliminará automáticamente cuando la fila principal se elimine.

3. Si aplicamos Update Cascade a la definición de clave externa, la fila secundaria se actualizará automáticamente cuando la fila principal se actualice.

Consulta: ALTER TABLE child ADD FOREIGN KEY (parent_id) REFERENCES parent (id) ON UPDATE CASCADE ON DELETE CASCADE;

  1. no puede eliminar la tabla principal directa, primero elimine la clave externa de la tabla secundaria que elimine la tabla principal.
Gaurav Kumar
fuente
7
Finalmente me di cuenta de lo que me confundía acerca de los ejemplos de claves externas. Como padre de cuatro hijos , no estoy acostumbrado a que el niño haga un seguimiento de los padres . En otros cuarenta años más o menos, esto ya no parecerá al revés.
Bob Stein
1
Gracias por dar a sus tablas de ejemplo nombres como "hijo" y "padre" ... en realidad es bastante útil y me gustaría que la documentación oficial lo hiciera.
Mike Rodent
7

La principal ventaja es que puede limitar los valores que puede ingresar en la tabla; si intenta ingresar un valor que no existe en la tabla referenciada, no podrá hacerlo.

Además, si actualiza o elimina el valor en la tabla referenciada, puede configurarlo para que actualice automáticamente el valor o elimine en cascada cualquier fila que contenga ese valor.

De hecho, es una gran característica aprovechar su código.

Seb
fuente