¿Qué es la base primaria de datos?

Clave Foránea (FOREIGN KEY): Enlazando Tablas

Valoración: 4.71 (8484 votos)

En el mundo de las bases de datos relacionales, la información raramente reside en una única tabla aislada. Por lo general, los datos están distribuidos en múltiples tablas que guardan relación entre sí. Por ejemplo, podrías tener una tabla con información de clientes y otra con los pedidos que han realizado. Para mantener la coherencia y evitar errores, es fundamental que estas relaciones estén bien definidas y controladas. Aquí es donde entra en juego el concepto de Clave Foránea, o FOREIGN KEY.

Una Clave Foránea es un pilar fundamental en el diseño de bases de datos relacionales. Su propósito principal es establecer y hacer cumplir un vínculo entre los datos de dos tablas diferentes. Actúa como un "puntero" desde una tabla (la "tabla hija" o referenciadora) hacia otra tabla (la "tabla padre" o referenciada), garantizando que los valores en la columna de la tabla hija correspondan a valores existentes en la columna de la tabla padre a la que se hace referencia.

¿Qué es PK y FK en Access?
En la tabla Clientes, es la clave principal. En la tabla Pedidos, se denomina clave externa. Una clave externa, en pocas palabras, es la clave principal de otra tabla . Para más información, consulte Fundamentos del diseño de bases de datos.

La columna o conjunto de columnas en la tabla hija que constituye la Clave Foránea debe hacer referencia a una Clave Primaria (PRIMARY KEY) o una Clave Única (UNIQUE KEY) en la tabla padre. Este mecanismo es esencial para mantener la integridad referencial de la base de datos, asegurando que las relaciones entre los datos sean siempre válidas y consistentes.

Índice de Contenido

¿Qué Propósito Tiene una Clave Foránea?

La función principal de una Clave Foránea es garantizar la integridad referencial. Esto significa que previene la existencia de "registros huérfanos". Por ejemplo, si tienes una tabla de `Pedidos` y una tabla de `Clientes`, y cada pedido está asociado a un cliente específico mediante un `ID_Cliente`, una Clave Foránea en la tabla `Pedidos` que referencia el `ID_Cliente` en la tabla `Clientes` evitaría que se inserte un pedido con un `ID_Cliente` que no existe en la tabla de `Clientes`. De manera similar, puede definir reglas sobre qué sucede si intentas eliminar un cliente que tiene pedidos asociados.

En resumen, los propósitos clave son:

  • Asegurar que los datos en una tabla que hacen referencia a otra tabla sean válidos.
  • Mantener la consistencia de las relaciones entre tablas.
  • Evitar la inserción de datos inconsistentes.
  • Controlar las acciones (como eliminación o actualización) en la tabla padre cuando hay registros relacionados en la tabla hija.

Sintaxis: ¿Cómo Definir una Clave Foránea?

Una Clave Foránea puede definirse al crear la tabla o modificar una tabla existente.

Definición al Crear la Tabla (CREATE TABLE)

La sintaxis general es:

CREATE TABLE nombre_tabla_hija (
columna1 tipo_dato restricciones,
columna_clave_foranea tipo_dato,
...,
CONSTRAINT nombre_restriccion_fk FOREIGN KEY (columna_clave_foranea)
REFERENCES nombre_tabla_padre (columna_clave_padre)
[ON DELETE accion]
[ON UPDATE accion]
);

Donde:

  • `nombre_restriccion_fk`: Un nombre opcional para la restricción (es recomendable darle un nombre descriptivo).
  • `columna_clave_foranea`: La columna o columnas en la tabla hija que actúan como Clave Foránea.
  • `nombre_tabla_padre`: El nombre de la tabla a la que se hace referencia.
  • `columna_clave_padre`: La columna o columnas en la tabla padre (debe ser una PRIMARY KEY o UNIQUE KEY).
  • `[ON DELETE accion]`, `[ON UPDATE accion]`: Opciones para especificar qué sucede cuando se elimina o actualiza un registro en la tabla padre que tiene registros relacionados en la tabla hija (ver sección de Acciones).

Ejemplo:

CREATE TABLE Clientes (
ID_Cliente INT PRIMARY KEY,
Nombre VARCHAR(100),
Apellido VARCHAR(100)
);

CREATE TABLE Pedidos (
ID_Pedido INT PRIMARY KEY,
ID_Cliente INT,
FechaPedido DATE,
CONSTRAINT FK_ClientePedido FOREIGN KEY (ID_Cliente)
REFERENCES Clientes (ID_Cliente)
);

Definición Después de Crear la Tabla (ALTER TABLE)

Si la tabla ya existe, puedes añadir la Clave Foránea usando `ALTER TABLE`:

ALTER TABLE nombre_tabla_hija
ADD CONSTRAINT nombre_restriccion_fk FOREIGN KEY (columna_clave_foranea)
REFERENCES nombre_tabla_padre (columna_clave_padre)
[ON DELETE accion]
[ON UPDATE accion];

Ejemplo:

-- Suponiendo que las tablas Clientes y Pedidos ya existen
ALTER TABLE Pedidos
ADD CONSTRAINT FK_ClientePedido FOREIGN KEY (ID_Cliente)
REFERENCES Clientes (ID_Cliente);

Acciones ON DELETE y ON UPDATE

Estas cláusulas son cruciales para definir el comportamiento de la base de datos cuando se intenta eliminar o actualizar filas en la tabla padre que son referenciadas por la tabla hija. Las opciones comunes son:

  • CASCADE: Si se elimina/actualiza una fila en la tabla padre, las filas correspondientes en la tabla hija también son eliminadas/actualizadas.
  • SET NULL: Si se elimina/actualiza una fila en la tabla padre, el valor de la columna de la Clave Foránea en las filas correspondientes de la tabla hija se establece a NULL. Esto requiere que la columna de la Clave Foránea en la tabla hija permita valores NULL.
  • RESTRICT: No permite la eliminación/actualización de una fila en la tabla padre si hay filas relacionadas en la tabla hija. Esta suele ser la acción por defecto si no se especifica nada.
  • NO ACTION: Similar a RESTRICT, pero la verificación de la restricción se realiza al final de la sentencia SQL o de la transacción, no inmediatamente. El resultado práctico es a menudo el mismo que RESTRICT.
  • SET DEFAULT: Si se elimina/actualiza una fila en la tabla padre, el valor de la columna de la Clave Foránea en las filas correspondientes de la tabla hija se establece a su valor por defecto. Requiere que la columna tenga un valor por defecto definido.

Aquí tienes una tabla comparativa de estas acciones:

AcciónComportamiento en DELETEComportamiento en UPDATEPermitido si hay hijos?Notas
CASCADEElimina hijosActualiza hijosPropaga la acción
SET NULLEstablece FK en hijos a NULLEstablece FK en hijos a NULLSí (si FK permite NULL)Requiere columna FK nullable
RESTRICTNo permite la eliminaciónNo permite la actualizaciónNoFalla la operación
NO ACTIONNo permite la eliminaciónNo permite la actualizaciónNoVerificación al final
SET DEFAULTEstablece FK en hijos a valor DEFAULTEstablece FK en hijos a valor DEFAULTSí (si FK tiene DEFAULT)Requiere columna FK con DEFAULT

FOREIGN KEY vs. PRIMARY KEY

Es importante no confundir Clave Foránea con Clave Primaria, aunque a menudo trabajan juntas. La Clave Primaria identifica de forma única cada fila en una tabla. No puede contener valores NULL y debe ser única para cada registro. La Clave Foránea, por otro lado, es un campo (o campos) en una tabla que hace referencia a la Clave Primaria (o Clave Única) de otra tabla. Su propósito es vincular registros entre tablas, no identificar registros dentro de su propia tabla.

Consideraciones al Usar Claves Foráneas

  • Rendimiento: Si bien son cruciales para la integridad, las Claves Foráneas pueden tener un impacto en el rendimiento, especialmente en operaciones de inserción, actualización y eliminación, ya que el sistema de base de datos debe verificar la restricción. Asegurarse de que la columna de la Clave Foránea en la tabla hija esté indexada suele mitigar este problema.
  • Orden de Operaciones: Para insertar datos en la tabla hija, el registro referenciado en la tabla padre debe existir primero. Para eliminar datos de la tabla padre, debes considerar las acciones `ON DELETE` o eliminar primero los registros hijos si la acción es RESTRICT o NO ACTION.
  • Claves Foráneas Compuestas: Una Clave Foránea puede estar compuesta por varias columnas que, en conjunto, referencian una clave primaria/única compuesta en la tabla padre.

Preguntas Frecuentes (FAQ)

P: ¿Una Clave Foránea siempre debe referenciar una Clave Primaria?
R: No, puede referenciar cualquier columna o conjunto de columnas que tenga una restricción UNIQUE.

P: ¿Puede una tabla tener múltiples Claves Foráneas?
R: Sí, una tabla puede tener varias Claves Foráneas, cada una referenciando una tabla diferente (o incluso la misma tabla, en el caso de relaciones jerárquicas).

P: ¿Una columna que es Clave Foránea puede contener valores NULL?
R: Sí, a menos que la columna esté definida con la restricción NOT NULL. Si la columna permite NULLs, un valor NULL en la Clave Foránea significa que esa fila en la tabla hija no está asociada a ninguna fila en la tabla padre (por ejemplo, un pedido que aún no tiene un cliente asignado, si el diseño lo permite).

P: ¿Es obligatorio usar Claves Foráneas?
R: Técnicamente no, podrías manejar la integridad referencial en el código de tu aplicación. Sin embargo, es una práctica muy recomendada y un estándar en el diseño de bases de datos relacionales, ya que asegura que la integridad se mantenga a nivel de base de datos, independientemente de la aplicación que acceda a ella.

P: ¿La columna de la Clave Foránea y la columna referenciada deben tener el mismo nombre?
R: No, no es necesario que tengan el mismo nombre, pero deben tener tipos de datos compatibles.

Conclusión

La Clave Foránea es un componente esencial en la construcción de bases de datos relacionales robustas y consistentes. Al definir claramente las relaciones entre tablas y hacer cumplir la integridad referencial, las Claves Foráneas previenen errores, mejoran la calidad de los datos y simplifican el desarrollo de aplicaciones que interactúan con la base de datos. Dominar su uso y comprender las diferentes acciones asociadas es fundamental para cualquier profesional que trabaje con SQL y diseño de bases de datos.

Si quieres conocer otros artículos parecidos a Clave Foránea (FOREIGN KEY): Enlazando Tablas puedes visitar la categoría Bases de datos.

Ivan

Soy un entusiasta de la tecnología con especialización en bases de datos, particularmente en MySQL. A través de mis tutoriales detallados, busco desmitificar los conceptos complejos y proporcionar soluciones prácticas a los desafíos cotidianos relacionados con la gestión de datos

Aprende mas sobre MySQL

Subir