2009-04-16 28 views
83

¿Hay alguna buena explicación de cómo usar la construcción de clave foránea de MySQL?Conceptos básicos de claves externas en MySQL?

No me sale exactamente de los documentos MySQL. Hasta ahora he estado manejando cosas como llaves extranjeras con combinaciones y código de programación.

Y la segunda parte de la pregunta, ¿hay alguna mejora que se pueda hacer utilizando las claves externas incorporadas de MySQL?

Respuesta

108

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

No mejoran las consultas en sentido de eficiencia, solo hacen que algunas consultas incorrectas fallen.

Si usted tiene una relación como ésta:

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 se puede eliminar una department si tiene algunos employee 's.

Si proporciona ON DELETE CASCADE a la definición FOREIGN KEY, las filas de referencia se eliminarán automáticamente junto con las referenciadas.

Como una restricción, FOREIGN KEY realmente ralentiza las consultas un poco.

Se debe realizar una comprobación adicional al eliminar de una tabla referenciada o al insertarla en una referencia.

+1

La ralentización es mínima, ya que normalmente hace FK en los campos indexados, lo que hace que encontrar los valores relevantes sea muy fácil. – Seb

+4

Es por eso que escribí "un poco" :) De hecho, eliminas muchas filas, el 'JOIN' subyacente puede ser mucho menos eficiente que dos DELETE usando – Quassnoi

+0

de FULL TABLE SCAN, ¿puedo crear un nuevo empleado con un' dept_id' que está ausente en 'departamento (id)' – Nishant

6

La principal ventaja es que puede limitar los valores que puede introducir 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 a la que se hace referencia, puede configurarlo para actualizar automáticamente el valor o eliminar en cascada cualquier fila que contenga ese valor.

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

30

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

Por ejemplo, imagine que está programando un foro. Tiene una tabla de "temas" con la clave principal topics.topic_id, y tiene una tabla de "publicaciones" donde las publicaciones se adjuntan a 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 lo asegura.

Para el beneficio en cascada, puede configurarlo de modo que si se elimina un tema de la tabla de temas, la base de datos elimina 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, lo que puede ser bastante complejo cuando tiene muchas tablas vinculadas entre sí. Con las claves externas, todas las relaciones se pueden limpiar automáticamente.

8

1.LAS LENGUAS MÁS FALSAS solo asegúrese de que sus datos sean consistentes.

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

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

Consulta: ALTER TABLE niño ADD FOREIGN KEY (parent_id) REFERENCIAS principal (ID) ON UPDATE CASCADE ON DELETE CASCADE;

  1. no se puede eliminar la tabla primaria directa, primero eliminar la clave foránea de la tabla hija que eliminar la tabla principal.
+4

Finalmente me di cuenta de lo que me confundía acerca de ejemplos de claves externas. Como padre de cuatro hijos, no estoy acostumbrado a que el niño ** rastree a los padres **. En otros cuarenta años más o menos, esto ya no podría parecer al revés. –

+0

Gracias por dar nombres a sus tablas de ejemplo como "niño" y "padre" ... en realidad es bastante útil y ¡ojalá la documentación oficial lo hiciera! –

Cuestiones relacionadas