Las claves ajenas (o claves foráneas) en una base de datos son restricciones que se utilizan para establecer relaciones entre tablas. Su propósito principal es asegurar la integridad referencial, garantizando que los valores en una columna o conjunto de columnas correspondan a valores existentes en otra tabla, creando una relación estructurada entre diferentes conjuntos de datos.
JOIN
.Una clave ajena en una tabla apunta a una clave primaria o a un índice único de otra tabla. Así, cuando se inserta o actualiza un registro en la tabla secundaria (que contiene la clave ajena), el sistema de bases de datos valida que el valor de la clave ajena exista en la tabla principal, evitando registros huérfanos.
Ejemplo de Relación entre Tablas:
Supongamos que tenemos una relación entre una tabla de departamentos
y una de empleados
, donde cada empleado debe estar asignado a un departamento existente.
Tabla Principal (Departamentos):
id_departamento
) que identifica cada departamento.Tabla Secundaria (Empleados):
id_departamento
como clave ajena que hace referencia a la clave primaria de la tabla departamentos
. Esto garantiza que todos los valores de id_departamento
en la tabla empleados
correspondan a un departamento válido.Para crear una clave ajena, necesitamos especificarla al momento de crear la tabla o agregarla después. Aquí mostramos ambas opciones.
CREATE TABLE departamentos (
id_departamento INT PRIMARY KEY,
nombre_departamento VARCHAR(50)
);
CREATE TABLE empleados (
id_empleado INT PRIMARY KEY,
nombre VARCHAR(50),
id_departamento INT,
CONSTRAINT fk_departamento FOREIGN KEY (id_departamento)
REFERENCES departamentos(id_departamento)
);
En este caso:
CONSTRAINT fk_departamento
establece la restricción de clave ajena.FOREIGN KEY (id_departamento) REFERENCES departamentos(id_departamento)
indica que id_departamento
en empleados
debe ser un valor existente en id_departamento
en departamentos
.Si ya tenemos ambas tablas creadas y queremos agregar la clave ajena más adelante, podemos hacerlo así:
ALTER TABLE empleados
ADD CONSTRAINT fk_departamento FOREIGN KEY (id_departamento)
REFERENCES departamentos(id_departamento);
Restricción de Eliminación y Actualización:
ON DELETE CASCADE
: Si un registro en la tabla principal se elimina, todos los registros relacionados en la tabla secundaria también se eliminan.ON DELETE SET NULL
: Si un registro en la tabla principal se elimina, los registros relacionados en la tabla secundaria tendrán NULL
en la clave ajena.ON UPDATE CASCADE
: Si el valor de la clave primaria cambia, se actualiza en todos los registros secundarios.Ejemplo:
ALTER TABLE empleados
ADD CONSTRAINT fk_departamento FOREIGN KEY (id_departamento)
REFERENCES departamentos(id_departamento)
ON DELETE CASCADE;
Validación y Rendimiento:
Tipos de Relación:
Supongamos que tenemos dos tablas para una librería: autores
y libros
. Queremos que cada libro esté relacionado con un autor existente.
Crear la Tabla Autores:
CREATE TABLE autores (
id_autor INT PRIMARY KEY,
nombre_autor VARCHAR(50)
);
Crear la Tabla Libros con una Clave Foránea:
CREATE TABLE libros (
id_libro INT PRIMARY KEY,
titulo VARCHAR(100),
id_autor INT,
CONSTRAINT fk_autor FOREIGN KEY (id_autor)
REFERENCES autores(id_autor) ON DELETE CASCADE
);
En este ejemplo:
fk_autor
garantiza que id_autor
en libros
corresponda siempre a un id_autor
en autores
.ON DELETE CASCADE
asegura que si un autor se elimina de autores
, todos sus libros en libros
también se eliminen automáticamente.Las claves ajenas son esenciales para mantener la integridad de los datos en una base de datos relacional, asegurando que las relaciones entre tablas estén correctamente definidas y que los datos sean consistentes.