▷ Integridad Referencial 【 ON DELETE Y ON UPDATE 】 y PARTICIPACIONES CERO en MySQL
Integridad Referencial y Participaciones Cero
Cuando trabajamos con bases de datos relacionales, es fundamental garantizar que los datos se mantengan consistentes y significativos. Aquí es donde conceptos como la integridad referencial y las participaciones cero desempeñan un papel muy importante. En este artículo, desglosaremos qué son, cómo funcionan y por qué son esenciales.
¿Qué es la integridad referencial?
La integridad referencial asegura que las relaciones entre tablas sean consistentes. Esto significa que los valores de una columna (o combinación de columnas) en una tabla hija deben coincidir con un valor existente en una tabla padre.
Por ejemplo, si tienes una tabla Pedidos
que hace referencia a la tabla Clientes
, cada valor en la columna id_cliente
de Pedidos
debe existir en la columna id
de Clientes
.
Cómo se implementa la integridad referencial
Esto se logra mediante el uso de claves foráneas (foreign keys). La clave foránea establece una relación entre las tablas, permitiendo que el sistema de la base de datos valide automáticamente las inserciones, actualizaciones o eliminaciones para mantener la consistencia.
Sintaxis para crear una clave foránea en SQL:
CREATE TABLE Pedidos (
id_pedido INT PRIMARY KEY,
id_cliente INT,
fecha DATE,
FOREIGN KEY (id_cliente) REFERENCES Clientes (id)
);
Con esta definición:
- No se puede insertar un
id_cliente
enPedidos
que no exista enClientes
. - Dependiendo de las restricciones configuradas, si eliminas un cliente de
Clientes
, los pedidos asociados enPedidos
podrían ser eliminados automáticamente, actualizados, o causar un error.
Cláusulas ON DELETE
y ON UPDATE
: Controlando las Acciones sobre Claves Foráneas
Cuando defines una clave foránea, puedes especificar qué debe ocurrir con los registros relacionados en la tabla hija si un registro de la tabla padre es eliminado o actualizado. Esto se logra mediante las cláusulas ON DELETE
y ON UPDATE
.
Estas cláusulas son esenciales para garantizar la integridad referencial y evitar que los datos en las tablas relacionadas queden en un estado inconsistente.
Opciones de ON DELETE
y ON UPDATE
CASCADE
- Descripción: Los cambios en la tabla padre se propagan automáticamente a los registros relacionados en la tabla hija.
- Uso típico: Para modelos donde los datos relacionados deben seguir los cambios de la tabla padre.
- Ejemplo de eliminación (
ON DELETE CASCADE
): Si eliminas un cliente en la tablaClientes
, todos los pedidos asociados en la tablaPedidos
también se eliminan. - Ejemplo de actualización (
ON UPDATE CASCADE
): Si cambias elid
de un cliente en la tablaClientes
, ese cambio se refleja automáticamente en la tablaPedidos
.
SET NULL
- Descripción: Los valores de las columnas relacionadas en la tabla hija se establecen en
NULL
cuando ocurre una eliminación o actualización en la tabla padre. - Uso típico: Para relaciones opcionales donde no siempre es necesario que haya una referencia válida.
- Ejemplo (
ON DELETE SET NULL
): Si eliminas un proyecto de la tablaProyectos
, los empleados asignados a ese proyecto tienen su columnaid_proyecto
establecida enNULL
.
- Descripción: Los valores de las columnas relacionadas en la tabla hija se establecen en
SET DEFAULT
- Descripción: Los valores de las columnas relacionadas se establecen en un valor predeterminado definido previamente.
- Uso típico: Para situaciones donde quieres que las relaciones inválidas se reemplacen con un valor específico.
- Ejemplo: Si eliminas un supervisor en la tabla
Supervisores
, todos los empleados relacionados podrían ser asignados a un supervisor predeterminado.
NO ACTION
(comportamiento por defecto)- Descripción: Prohíbe la eliminación o actualización si hay registros relacionados en la tabla hija.
- Uso típico: Para mantener estrictamente la integridad referencial, impidiendo cambios que dejarían datos huérfanos.
- Ejemplo: No se puede eliminar un cliente si tiene pedidos activos.
RESTRICT
(similar aNO ACTION
)- Descripción: Similar a
NO ACTION
, pero verifica la restricción inmediatamente. Mientras tanto,NO ACTION
permite verificarla al final de la transacción. - Ejemplo: No puedes actualizar o eliminar un registro en la tabla padre si afecta a registros en la tabla hija.
- Descripción: Similar a
Ejemplo Práctico
Supongamos que tienes dos tablas: Clientes
y Pedidos
.
Definición con ON DELETE
y ON UPDATE
:
CREATE TABLE Clientes (
id INT PRIMARY KEY,
nombre VARCHAR(100)
);
CREATE TABLE Pedidos (
id_pedido INT PRIMARY KEY,
id_cliente INT,
fecha DATE,
FOREIGN KEY (id_cliente) REFERENCES Clientes(id)
ON DELETE CASCADE
ON UPDATE CASCADE
);
Lo que sucede:
ON DELETE CASCADE
: Si eliminas un cliente en la tabla Clientes
, automáticamente se eliminan todos los pedidos asociados en la tabla Pedidos
.
DELETE FROM Clientes WHERE id = 1;
Esto elimina también los pedidos con id_cliente = 1
.
ON UPDATE CASCADE
: Si cambias el id
de un cliente en Clientes
, el id_cliente
de todos los pedidos relacionados en la tabla Pedidos
se actualiza automáticamente.
UPDATE Clientes SET id = 2 WHERE id = 1;
Esto actualiza todos los registros en
Pedidos
donde id_cliente = 1
a id_cliente = 2
.Participaciones cero en relaciones
La participación cero ocurre cuando una tabla no está obligada a tener una relación con otra en un momento dado. En términos prácticos, significa que una clave foránea puede aceptar valores nulos (NULL
), lo que indica que no existe una relación en ese registro específico.
Ejemplo de participación cero:
Supongamos que tienes una tabla Empleados
y otra tabla Proyectos
. Algunos empleados pueden no estar asignados a ningún proyecto.
Definición con participación cero:
CREATE TABLE Empleados (
id_empleado INT PRIMARY KEY,
nombre VARCHAR(100),
id_proyecto INT NULL,
FOREIGN KEY (id_proyecto) REFERENCES Proyectos (id)
);
id_proyecto
permite valores nulos (NULL
), lo que indica que el empleado no está asignado a ningún proyecto. Esto representa una participación opcional.Participaciones obligatorias vs. participaciones cero
Ejemplo:
CREATE TABLE Pedidos (
id_pedido INT PRIMARY KEY,
id_cliente INT NOT NULL,
fecha DATE,
FOREIGN KEY (id_cliente) REFERENCES Clientes (id)
);
Participación cero: La relación es opcional, y la clave foránea puede ser nula.
Ejemplo:
CREATE TABLE Facturas (
id_factura INT PRIMARY KEY,
id_pedido INT NULL,
fecha DATE,
FOREIGN KEY (id_pedido) REFERENCES Pedidos (id)
);
En este caso, puede haber facturas que no estén asociadas a un pedido específico.
Buenas prácticas para trabajar con integridad referencial y participaciones
- Define correctamente las claves foráneas: Asegúrate de que las relaciones reflejen los requisitos reales de tu modelo de datos.
- Decide cuándo usar participación cero: Usa columnas nulas solo cuando sea necesario y tenga sentido en el contexto del negocio.
- Utiliza restricciones adicionales si es necesario: Además de las claves foráneas, puedes usar restricciones como
ON DELETE CASCADE
oON DELETE SET NULL
para definir qué sucede con los registros relacionados al eliminar datos en la tabla padre. - Documenta tus relaciones: Es importante que todos los desarrolladores que trabajen con tu base de datos entiendan las reglas de integridad y participación.
En el siguiente video te muestro como usar la integridad referencial y las participaciones cero.
Comentarios
Publicar un comentario
Cuéntame que opinas acerca del artículo. Recuerda ser respetuoso si quieres que se publique tu comentario 😊