Volver a la lista de artículos Artículos
Lectura de 14 minutos

¿Cuál es el beneficio de las claves foráneas en SQL?

¿Qué es una clave foránea y por qué es tan importante en las bases de datos relacionales? Conoce todos los detalles sobre las claves foráneas en este artículo.

Una de las características clave de las bases de datos relacionales es la capacidad de enlazar datos almacenados en diferentes tablas. Estos enlaces, llamados referencias, actúan esencialmente como conexiones entre tablas. Se crean utilizando la restricción FOREIGN KEY en las columnas de la tabla.

En este artículo, aprenderemos qué hace la restricción FOREIGN KEY en SQL. Explicaré cómo definirla utilizando la sentencia CREATE TABLE y veremos algunos ejemplos. A continuación, hablaremos de sus ventajas y características. En concreto:

  • Aprenderemos sobre la relación entre la tabla primaria (que proporciona los valores de su(s) columna(s) de clave primaria a la tabla foránea) y la tabla foránea (que utiliza la(s) columna(s) proporcionada(s) por la tabla primaria como su clave foránea).
  • Hablaremos de lo que ocurre cuando los valores de la columna de la tabla primaria se eliminan o cambian. Hay varias opciones que ofrece la restricción FOREIGN KEY en tales situaciones - las aclararé incluyendo algunos ejemplos.
  • Al final, hablaremos de las opciones de cardinalidad que se pueden implementar con la restricción FOREIGN KEY

Comencemos.

¿Qué es una restricción de clave foránea en SQL?

Para entender el concepto de la restricción FOREIGN KEY en SQL, puede pensar en ella como un enlace de referencia entre las tablas que se conocen como primaria (o padre) y extranjera (o hija). La tabla externa hace referencia a una o más columnas (la clave primaria, que puede ser una o más columnas) en la tabla primaria; así es como se crea el enlace. Si necesitas refrescar tus conocimientos sobre las claves primarias en SQL, te recomiendo que leas el artículo ¿Qué es una clave primaria?

Un ejemplo en imágenes

Creo que algunas ayudas visuales pueden ser útiles aquí. Veamos las siguientes imágenes.

Claves foráneas en SQL

Aquí, tenemos la tabla Airplane (la tabla primaria) y la tabla Flight (la tabla externa). La columna AirplaneId, que es una columna de clave primaria para la tabla Airplane, se utiliza como columna de clave externa en la tabla Flight tabla. Así es como se crea la relación entre estas tablas: la columna AirplaneId de la tabla Flight define qué avión se utiliza para cada vuelo.

Tenga en cuenta que la columna AirplaneId de la tabla externa Flight no tiene por qué contener todos los valores almacenados en Airplane.AirplaneId. Puede contener un subconjunto de estos valores:

Claves foráneas en SQL

Los valores contenidos en la columna Flight.AirplaneId se refieren directamente a los valores contenidos en la columna Airplane.AirplaneId. Por lo tanto, cualquier acción de actualización o eliminación de las filas de la tabla primaria Airplane debe reflejarse en consecuencia en la tabla externa Flight. La restricción FOREIGN KEY ofrece varias opciones para implementar estas actualizaciones o eliminaciones, que se discutirán más adelante.

Y una cosa más importante. El ejemplo anterior muestra una relación entre las tablas Airplane y Flight utilizando sólo una columna. También es posible utilizar varias columnas para crear estas relaciones entre tablas.

Claves foráneas en SQL

En este caso, en lugar de utilizar la columna AirplaneId para la restricción FOREIGN KEY, hemos decidido utilizar las columnas AirplaneBrand y AirplaneModel, ya que también identifican de forma exclusiva cada fila de la tabla Airplane (suponiendo que nuestra compañía aérea sólo posee un avión de cada par marca-modelo que aparece en la tabla).

Puede observar que también podríamos colocar todos los datos en una tabla llamada AirplaneFlight. Eso es cierto; sin embargo, entonces no podríamos separar los datos en diferentes categorías dentro de una tabla. Esa es la razón por la que las claves externas son una parte crucial del diseño de la base de datos. Nos permiten colocar datos relacionados en varias tablas y luego enlazarlos para mantener su integridad.

Cómo Definir la Restricción de Clave Foránea en SQL

Ahora queremos llevar nuestro diseño a la base de datos. Podemos hacerlo utilizando la sentencia CREATE TABLE y definiendo la restricción FOREIGN KEY dentro de ella.

Veamos cómo queda la sentencia CREATE TABLE si definimos la restricción FOREIGN KEY basándonos en el ejemplo anterior, que utiliza la columna AirplaneId.

En primer lugar, debemos crear la tabla primaria y definir su columna de clave primaria.

CREATE TABLE Airplane (
AirplaneId VARCHAR(10) NOT NULL,
AirplaneBrand VARCHAR(30) NOT NULL,
AirplaneModel VARCHAR(30) NOT NULL,
CONSTRAINT PK_AirplaneId PRIMARY KEY (AirplaneId)
);

Para revisar la restricción PRIMARY KEY, consulte ¿Qué es una clave primaria en SQL?

A continuación, creamos la tabla externa:

CREATE TABLE Flight (
FlightId VARCHAR(10) NOT NULL,
AirplaneId VARCHAR(10) NOT NULL,
PilotId INTEGER NOT NULL,
CONSTRAINT PK_FlightId PRIMARY KEY (FlightId),
CONSTRAINT FK_AirplaneId FOREIGN KEY (AirplaneId)
REFERENCES Airplane(AirplaneId)
);

Aquí, además de la restricción PRIMARY KEY, hemos definido la restricción FOREIGN KEY. Le hemos dado el nombre de FK_AirplaneId. Entre paréntesis, definimos la columna de la tabla Flight que implementa la restricción FOREIGN KEY. Después de la palabra clave REFERENCES, siguen el nombre de la tabla primaria y una columna.

Así es como podemos trasladar nuestro concepto de diseño de base de datos a una base de datos viable.

Puede ocurrir que queramos añadir la restricción FOREIGN KEY a la tabla Flight después de haber creado la tabla. Para ello, utilizamos la sentencia ALTER TABLE:

ALTER TABLE Flight ADD FOREIGN KEY FK_AirplaneId (AirplaneId)
REFERENCES Airplane(AirplaneId);

También es posible que queramos eliminar una restricción de FOREIGN KEY. Supongamos que queremos cambiar la restricción FOREIGN KEY definida anteriormente por su versión multicolumna. Primero debemos eliminarla y luego crear la nueva clave:

ALTER TABLE Flight DROP FOREIGN KEY FK_AirplaneId;
ALTER TABLE Flight ADD FOREIGN KEY FK_Airplane (AirplaneBrand, AirplaneModel)
REFERENCES Airplane(AirplaneBrand, AirplaneModel);

Ahora, la tabla<strong>Flight utiliza la restricción multicolumna FOREIGN KEY .

Si crees que necesitas más práctica con la creación de tablas de bases de datos, consulta nuestro curso sobre Los fundamentos de la creación de tablas en SQL.

¿Cuáles son los beneficios de las claves foráneas?

Ahora que hemos aprendido los fundamentos de la restricción FOREIGN KEY, sus características y las posibilidades que ofrece para la funcionalidad de la base de datos, podemos profundizar en sus beneficios.

Como ya he mencionado, al implementar una restricción FOREIGN KEY, podemos distinguir entre la tabla primaria y la tabla externa.

La tabla primaria proporciona una columna, o un conjunto de columnas, que es utilizada por la tabla externa. En otras palabras, la columna (o conjunto de columnas) de la tabla externa hace referencia a una columna (o conjunto de columnas) de la tabla primaria.

Así, la primera ventaja de la restricción FOREIGN KEY es que garantiza la existencia de la fila referenciada en la tabla primaria. Si la fila referenciada no está en la tabla primaria, no puede estar presente en la tabla externa.

Claves foráneas en SQL

Otra ventaja de la restricción FOREIGN KEY (FK) es que garantiza la corrección de la referencia incluso cuando se modifican o eliminan los valores de la tabla primaria. Hay una variedad de acciones que indican qué hacer en la actualización o eliminación de una fila de clave primaria (PK). Veamos cuáles son estas acciones.

Cuando se elimina una fila de clave primaria

La restricción FOREIGN KEY ofrece una serie de opciones sobre lo que se debe hacer cuando se elimina una fila de clave primaria de la tabla primaria.

Por defecto, cuando no se especifica ninguna acción para la restricción FOREIGN KEY, no se puede eliminar la fila correspondiente en la tabla primaria (padre) si hay filas que hacen referencia a ella en la tabla extranjera (hija).

Se puede especificar la acción a tomar en la eliminación de la(s) fila(s) PK de la tabla primaria eligiendo una de las siguientes:

  • ON DELETE CASCADE
  • ON DELETE RESTRICT
  • ON DELETE NO ACTION
  • ON DELETE SET NULL
  • ON DELETE SET DEFAULT

Veamos cada una de ellas. Primero, veremos la sintaxis que comparten todas estas opciones.

Sintaxis de ON DELETE

La declaración de la opción ON DELETE sigue directamente a la declaración de la restricción FOREIGN KEY.

ALTER TABLE Flight ADD FOREIGN KEY FK_AirplaneId (AirplaneId)
REFERENCES Airplane(AirplaneId)
ON DELETE 

Ahora veamos todas las opciones.

ON DELETE CASCADE

La opción ON DELETE CASCADE garantiza que cuando se elimina una fila del PK de la tabla primaria, también se elimina la fila de la tabla externa que hace referencia a ella.

Veámosla en acción utilizando nuestros Airplane y Flight y la tabla. Primero, tenemos las dos tablas relacionadas:

Claves foráneas en SQL

Eliminamos una fila de la tabla primaria:

Claves foráneas en SQL

Y ahora, la fila que hace referencia a la fila eliminada se elimina de la tabla externa.

Claves foráneas en SQL

Para implementar la opción ON DELETE CASCADE, añádala después de la declaración de la restricción FOREIGN KEY:

ALTER TABLE Flight ADD FOREIGN KEY FK_AirplaneId (AirplaneId)
REFERENCES Airplane(AirplaneId)
ON DELETE CASCADE;

Debería pensar en implementar la opción ON DELETE CASCADE con la restricción FOREIGN KEY cuando lo desee:

  • La posibilidad de eliminar filas de la tabla primaria sin ninguna restricción.
  • Eliminar automáticamente las filas de la tabla externa cuando se elimina la fila de referencia de la tabla primaria.

ON DELETE RESTRICT

La opción ON DELETE RESTRICT no permite la eliminación de filas de clave primaria en la tabla primaria. Cuando se intenta realizar esta acción, se devuelve un error.

Esto es útil para evitar cualquier cambio no deseado en las tablas primaria y externa.

ON DELETE NO ACTION

La opción ON DELETE NO ACTION es similar a la opción ON DELETE RESTRICT; también impide el borrado de las filas de la tabla primaria y arroja un error si se intenta dicha acción.

La diferencia entre ON DELETE NO ACTION y ON DELETE RESTRICT es que en algunas bases de datos ON DELETE NO ACTION puede ser diferida, es decir, puede ser pospuesta hasta después de la transacción para que el eventual error sea lanzado después de que la transacción se complete -es decir, en el curso de la transacción el valor de la clave foránea puede ser fijado, de lo contrario el error es lanzado.

ON DELETE SET NULL

La opción ON DELETE SET NULL hace exactamente lo que dice. Cuando se elimina una fila de la tabla primaria, los valores de las columnas que hacen referencia a ella en la tabla foránea se establecen en NULL.

Veamos un ejemplo a continuación. Aquí están de nuevo las dos tablas.

Claves foráneas en SQL

Eliminamos una fila de la tabla primaria.

Claves foráneas en SQL

Y ahora, el valor de la columna AirplaneId de la fila que hace referencia a la fila eliminada se establece en NULL en la tabla externa.

Claves foráneas en SQL

La opción ON DELETE SET NULL se puede utilizar cuando se quiere permitir la eliminación de filas en la tabla primaria pero no se quiere que se propague a la tabla externa. Hay una huella de la eliminación en la tabla extranjera (el valor marcado NULL).

ON DELETE SET DEFAULT

La opción ON DELETE SET DEFAULT es algo similar a la opción ON DELETE SET NULL. Aquí, después de la eliminación de la fila en la tabla primaria, establecemos el valor de la columna FK de la tabla externa a su valor por defecto en lugar de NULL.

Tenga en cuenta que se debe especificar un valor por defecto para la(s) columna(s) de clave externa.

Vamos a especificar un valor por defecto para la columna AirplaneId de la tabla Flight tabla:

ALTER TABLE Flight
ALTER AirplaneId
SET DEFAULT 'ABA340';

Ahora podemos utilizar la opción ON DELETE SET DEFAULT. Tras la eliminación de la fila de la tabla primaria, ocurrirá lo siguiente:

Claves foráneas en SQL

Debe utilizar la opción ON DELETE SET DEFAULT cuando quiera permitir la eliminación de filas en la tabla primaria. El grado de control en este caso es que puede elegir qué valor se inserta en la tabla ajena al borrar la fila en la tabla primaria.

Cuando se actualiza una fila de la clave primaria

Las acciones que ofrece la restricción FOREIGN KEY sobre la actualización realizada en la tabla primaria son similares a las acciones sobre la eliminación. También lo es la sintaxis.

Sintaxis de ON UPDATE

La declaración de la opción ON UPDATE sigue directamente a la declaración de la restricción FOREIGN KEY.

ALTER TABLE Flight ADD FOREIGN KEY FK_AirplaneId (AirplaneId)
REFERENCES Airplane(AirplaneId)
ON UPDATE 

Por defecto, cuando no se especifica ninguna acción para la restricción FOREIGN KEY, no es posible modificar las filas de la tabla primaria (padre) si hay filas que hacen referencia a ella en la tabla extranjera (hija).

Se puede definir lo que ocurre en la actualización de la(s) fila(s) de la tabla primaria eligiendo una de las siguientes opciones:

  • ON UPDATE CASCADE
  • ON UPDATE RESTRICT
  • ON UPDATE NO ACTION
  • ON UPDATE SET NULL
  • ON UPDATE SET DEFAULT

Veamos cada una de ellas.

EN CASCADA DE ACTUALIZACIÓN

La opción ON UPDATE CASCADE permite modificar los valores de la(s) columna(s) PK de la tabla primaria. Estos cambios se propagan a la tabla externa.

Veámoslo en acción usando nuestros Airplane y Flight tablas:

Claves foráneas en SQL

Modificamos los valores de la última fila de la tabla primaria.

Claves foráneas en SQL

Y ahora, la fila que hace referencia a ella también se actualiza.

Claves foráneas en SQL

Para implementar la opción ON UPDATE CASCADE, añádala después de la declaración de la restricción FOREIGN KEY:

ALTER TABLE Flight ADD FOREIGN KEY FK_AirplaneId (AirplaneId)
REFERENCES Airplane(AirplaneId)
ON UPDATE CASCADE;

Esta opción permite modificar la(s) columna(s) de la clave primaria de la tabla primaria. Cualquier modificación se propaga a la(s) clave(s) externa(s).

RESTRINGIR LA ACTUALIZACIÓN

Si desea impedir cualquier modificación de la clave primaria de la tabla, utilice la opción ON UPDATE RESTRICT.

Si se intenta modificar los valores de la PK de la tabla primaria, se devuelve un error.

ON UPDATE NO ACTION

La opción ON UPDATE NO ACTION es similar a la opción ON UPDATE RESTRICT. No se permiten cambios en la PK de la tabla primaria.

La diferencia es que algunas bases de datos permiten posponer las comprobaciones de las acciones hasta después de la transacción con ON UPDATE NO ACTION. Si los valores PK de la tabla primaria se modifican cuando se completa la transacción, se lanza un error.

ON UPDATE SET NULL

La opción ON UPDATE SET NULL permite modificar la PK de la tabla primaria. En tales actualizaciones, los valores de la FK de la tabla externa se establecen en NULL.

Veamos un ejemplo a continuación, partiendo de las dos tablas:

Claves foráneas en SQL

Modificamos los valores de la última fila de la tabla primaria.

Claves foráneas en SQL

Y ahora, la fila que hace referencia a ella se establece en NULL.

Claves foráneas en SQL

ON UPDATE SET DEFAULT

La opción ON UPDATE SET DEFAULT permite modificar la PK de la tabla primaria. Como resultado, los valores de la clave externa se establecen en su valor por defecto. Sólo se puede utilizar esta opción si se declara un valor por defecto para la(s) columna(s) de la clave externa.

Especifiquemos el valor por defecto para la columna AirplaneId de la tabla Flight tabla:

ALTER TABLE Flight
ALTER AirplaneId
SET DEFAULT 'ABA340';

Ahora, podemos utilizar la opción ON UPDATE SET DEFAULT. Después de la actualización de la fila de la tabla primaria, ocurrirá lo siguiente:

Claves foráneas en SQL

Cardinalidad de la restricción de clave foránea

Otra característica que ofrece la restricción FOREIGN KEY es su cardinalidad. Al establecer la cardinalidad, podemos decidir cómo se relacionan la(s) columna(s) de clave foránea con la(s) columna(s) de clave primaria. Las relaciones pueden ser

  • De uno a uno (un valor de fila PK puede aparecer exactamente en una fila FK).
  • De varios a uno (un valor de fila PK puede aparecer en una o varias filas FK).
  • De muchos a muchos (muchos valores de filas PK pueden aparecer en muchas filas FK).

Para implementar la relación uno a uno, debemos declarar la(s) columna(s) de clave externa como UNIQUE. En este caso, la relación es realmente (uno o cero)-a-uno, pero asegura que hay como máximo una fila en la tabla foránea que se relaciona con una fila particular de la tabla primaria.

Claves foráneas en SQL

Por otro lado, si la(s) columna(s) de clave externa de la tabla externa no se declara(n) como UNIQUE, entonces la relación entre la(s) columna(s) de clave externa y la(s) columna(s) de clave primaria es de muchos a uno: muchas filas de la tabla externa pueden relacionarse con una sola fila de la tabla primaria.

Claves foráneas en SQL

La relación muchos-a-muchos se implementa usando una tabla separada que almacena cada par de filas relacionadas.

Claves foráneas en SQL

Fíjate que cuando creamos esta relación de muchos a muchos, el enlace directo entre las tablas Airplane y Flight se convierte en una tabla separada que almacena todas las relaciones en pares AirplaneId-FlightId.

La tabla AirplaneFlight tabla tiene una clave externa (AirplaneId) que hace referencia a la columna AirplaneId de la Airplane tabla. También tiene una clave foránea (FlightId) que hace referencia a la columna FlightId de la Flight tabla. Las columnas Airplane y Flight están ahora indirectamente vinculadas entre sí.

¿Quiere saber más sobre las claves foráneas en SQL?

La restricción FOREIGN KEY es crucial para el diseño de bases de datos relacionales. Nos permite vincular los datos según nuestras necesidades. Como crea algunas dependencias entre las columnas de las tablas primaria y foránea, también nos permite decidir qué hacer ON UPDATE y ON DELETE acciones realizadas en las filas de la tabla primaria.

Al utilizar la restricción FOREIGN KEY, aseguramos la integridad, la corrección y la compacidad de los datos. Los valores utilizados por la tabla externa deben existir en la tabla primaria. Además, podemos imponer reglas sobre el tipo de relación, es decir, uno a uno, muchos a uno o muchos a muchos.

Si quieres saber más sobre las claves externas, consulta nuestro artículo sobre ¿Qué es una clave externa en SQL?

Para obtener más información sobre la estructura y el diseño de la base de datos, recomiendo nuestro tema sobre la creación de la estructura de la base de datos, que incluye todo lo esencial. Puedes leer sobre este tema aquí antes de entrar en él.