Hasta ahora no nos hemos planteado cómo se relacionan unas tablas con otras dentro de una base de datos. Si tenemos las tablas Usuarios y Partidas, necesariamente habrá una "relación" entre ellas. Deben compartir algún dato en común que las relacione. Una partida es jugada por un jugador (Usuarios), por lo que en la tabla Partida deberíamos guardar algún dato del usuario-jugador, pero ¿cuál?
Una clave ajena, también llamada externa, foránea o secundaria, es un atributo o conjunto de atributos de una relación cuyos valores coinciden con los valores de la clave primaria de alguna otra relación (o de la misma). Las claves ajenas representan relaciones entre datos. Dicho de otra manera, son los datos de atributos de una tabla cuyos valores están relacionados con atributos de otra tabla.
En la tabla Partidas, se recogen datos como Cod_partida, Fecha y Hora de creación, Nombre de la partida, etc. ¿Qué campo utilizaremos para relacionarla con la tabla Usuarios? Si nos basamos en la definición, deberíamos utilizar la clave primaria de la tabla Usuarios. Por tanto, el atributo Login que es la clave principal en su tabla aparecerá en la tabla Partidas como clave ajena, externa o secundaria. El Login en Partidas hace referencia a cada jugador que juega esa partida. En lugar de guardar todos los datos de ese jugador en la misma tabla, lo hacemos en otra y lo "referenciamos" por su clave primaria tomándola como ajena.
Es lógico que las claves ajenas no tengan las mismas propiedades y restricciones que tienen como clave primaria en su tabla, por tanto, sí que pueden repetirse en la tabla. En nuestro ejemplo, un mismo jugador puede jugar varias partidas.
Las claves ajenas tienen por objetivo establecer una conexión con la clave primaria que referencian. Por lo tanto, los valores de una clave ajena deben estar presentes como clave primaria en la tabla a la que hacen referencia , o bien deben ser valores nulos. En caso contrario, la clave ajena representaría una referencia o conexión incorrecta, lo que supondría que la información almacenada es inconsistente (no fiable). Imagina un código de jugador en la tabla Partidas que no se corresponde con ningún jugador de la tabla Usuarios.
No podemos tener una partida de un jugador que previamente no se ha registrado y no existe en la tabla Usuarios. Pero sí podemos tener los datos de una partida y desconocer el jugador de ésta, es decir la columna jugador puede tener el valor nulo (sin valor).