En este capítulo veremos como relacionar dos tablas para evitar duplicados. Si tenemos una tabla llamada por ejm reuniones, en la cual vamos a llamar a diferentes personas a una reunión, y los datos de dichas personas ya están incluidos en otra tabla denominada personas, podemos incluir en nuestra primera tabla reuniones un id que apunte a la tabla personas, para que en el caso de realizar una consulta podamos extraer los datos que necesitemos de ambas tablas. A este id lo vamos a denominar clave o llave foránea, y dicha llave relaciona ambas tablas.

Como podemos ver, en la tabla reuniones hemos colocado una última columna con la llave primaria de la tabla contactos, por lo que ambas tablas quedan relacionadas.
Para trabajar sobre todo ello ya no vamos a utilizar Workbench, sino que vamos a utilizar la herramienta PHP MyAdmin, la cual instalamos por defecto cuando instalamos el paquete XAMPP. Para acceder a ella hemos de escribir en el navegador la siguiente dirección:
Esta herramienta es muy similar a Workbench, e incluso se puede decir que casi más intuitiva. Vamos a crear una base de datos denominada prueba en la cual crearemos dos tablas, denominadas contactos y reuniones, como en la tabla de más arriba. Es importante reseñar que la llave foránea debe estar creada con el mismo tipo de dato que la clave primaria, sino nos dará error.
Restricciones de llaves foráneas
Podemos agregar restricciones de llaves foráneas para que no insertemos en la consulta de la llave foránea cualquier datos sino solamente los valores correctos. Para ello vamos en nuestro ejm a la tabla reuniones, elegimos Estructura y hacemos clic en Vista de relaciones, y hemos de relacionar la clave foránea de nuestra tabla reuniones con la clave primaria de la tabla contactos. Desde este punto podremos agregar restricciones a una determinada columna, a esta restricción le tenemos que dar un nombre, por lo general debe ser identificativo. Las llaves foráneas se suelen referenciar con fk_ seguida de las tablas relacionadas, en nuestro caso fk_reuniones_contactos. El siguiente paso es determinar a qué columna queremos agregar esta llave foránea, en nuestro caso a la columna contactos_id. Lo siguiente es especificar la tabla y la base de datos a la que voy a hacer referencia, y lo próximo es escoger la llave primaria a la cual estoy haciendo referencia.
Eliminar registros
Si intentásemos eliminar registros que tienen llaves foráneas, como hemos agregado la restricción de llave foránea, no nos va a permitir eliminar porque existe un registro en la tabla de reuniones que hace referencia al registro que tenemos en nuestra base de datos. Para poder eliminar dicha restricción nos dirigimos a la tabla reuniones que es donde hemos creado la restricción de llave foránea, y modificar un poco esta llave foránea, para ello desde PHPMyAdmin vamos a:
Estructura > Vista de relaciones
Y tenemos que centrarnos en las opciones:
- ON DELETE = RESTRICT (valor por defecto)
- ON UPDATE = RESTRICT (valor por defecto)
Normalmente tienen el valor RESTRICT que es el valor que nos impide eliminar los registros. Además de STRICT existen las opciones CASCADE y SETNULL. CASCADE, cuando eliminemos un registro (por ejm el id = 1) en la tabla contactos, también se va a eliminar por cascada todas las reuniones que se hayan agendado al id = 1. También existe la forma en la cual eliminemos el contacto pero no las reuniones agendadas a dicho contacto, para lo cual escogemos la opción SETNULL. Lo que sí que hay que hacer es sustituir el valor de la clave foránea que se ha borrado por un valor NULL. No se puede quedar con un valor que no existe. Lo que tenemos que hacer por tanto es ir en la tabla contactos al campo contactos_id y permitir que acepte valores nulos. Por último sustituimos el valor RESTRICT por el valor SETNULL, de manera que cuando eliminemos dicho contacto, automáticamente en la tabla reuniones aparecerá el valor NULL.
La opción CASCADE permite que si modificamos un registro, se actualice en el resto. Esta opción es muy útil para no perder la coherencia en la información que almacenamos en diferentes tablas.