La integridad referencial es un concepto fundamental en el diseño y gestión de bases de datos relacionales. Garantiza que las relaciones entre tablas se mantengan coherentes, evitando la existencia de referencias inválidas o huérfanas.

Conceptos Clave

  1. Clave Primaria (Primary Key):

    • Es un campo (o combinación de campos) que identifica de manera única cada registro en una tabla.
    • Ejemplo: En una tabla Clientes, el campo ClienteID puede ser la clave primaria.
  2. Clave Foránea (Foreign Key):

    • Es un campo en una tabla que se refiere a la clave primaria de otra tabla.
    • Ejemplo: En una tabla Pedidos, el campo ClienteID puede ser una clave foránea que se refiere a ClienteID en la tabla Clientes.
  3. Restricción de Integridad Referencial:

    • Es una regla que asegura que las claves foráneas en una tabla siempre correspondan a valores válidos en la tabla referenciada.
    • Ejemplo: Si ClienteID en Pedidos debe existir en Clientes, no se puede insertar un pedido con un ClienteID que no exista en Clientes.

Ejemplo Práctico

Consideremos dos tablas: Clientes y Pedidos.

Tabla Clientes

CREATE TABLE Clientes (
    ClienteID INT PRIMARY KEY,
    Nombre VARCHAR(100),
    Email VARCHAR(100)
);

Tabla Pedidos

CREATE TABLE Pedidos (
    PedidoID INT PRIMARY KEY,
    Fecha DATE,
    ClienteID INT,
    FOREIGN KEY (ClienteID) REFERENCES Clientes(ClienteID)
);

En este ejemplo:

  • ClienteID en Clientes es la clave primaria.
  • ClienteID en Pedidos es una clave foránea que referencia a ClienteID en Clientes.

Operaciones de Integridad Referencial

  1. Inserción:

    • No se puede insertar un registro en Pedidos con un ClienteID que no exista en Clientes.
    -- Esto fallará si no existe un ClienteID = 1 en la tabla Clientes
    INSERT INTO Pedidos (PedidoID, Fecha, ClienteID) VALUES (1, '2023-10-01', 1);
    
  2. Actualización:

    • Si se actualiza ClienteID en Clientes, se debe asegurar que las referencias en Pedidos se mantengan coherentes.
    -- Esto fallará si existen registros en Pedidos que referencian al ClienteID = 1
    UPDATE Clientes SET ClienteID = 2 WHERE ClienteID = 1;
    
  3. Eliminación:

    • No se puede eliminar un registro en Clientes si existen registros en Pedidos que lo referencian.
    -- Esto fallará si existen registros en Pedidos que referencian al ClienteID = 1
    DELETE FROM Clientes WHERE ClienteID = 1;
    

Opciones de Integridad Referencial

Al definir una clave foránea, se pueden especificar acciones a realizar en cascada:

  1. ON DELETE CASCADE:

    • Si se elimina un registro en la tabla referenciada, también se eliminan los registros relacionados en la tabla que contiene la clave foránea.
    CREATE TABLE Pedidos (
        PedidoID INT PRIMARY KEY,
        Fecha DATE,
        ClienteID INT,
        FOREIGN KEY (ClienteID) REFERENCES Clientes(ClienteID) ON DELETE CASCADE
    );
    
  2. ON UPDATE CASCADE:

    • Si se actualiza la clave primaria en la tabla referenciada, se actualizan automáticamente las claves foráneas en la tabla relacionada.
    CREATE TABLE Pedidos (
        PedidoID INT PRIMARY KEY,
        Fecha DATE,
        ClienteID INT,
        FOREIGN KEY (ClienteID) REFERENCES Clientes(ClienteID) ON UPDATE CASCADE
    );
    

Ejercicio Práctico

Ejercicio

  1. Crea las tablas Clientes y Pedidos con las restricciones de integridad referencial adecuadas.
  2. Inserta algunos registros en Clientes.
  3. Intenta insertar un registro en Pedidos con un ClienteID que no exista en Clientes.
  4. Actualiza un ClienteID en Clientes y observa el comportamiento en Pedidos.
  5. Elimina un registro en Clientes y observa el comportamiento en Pedidos.

Solución

-- Crear tabla Clientes
CREATE TABLE Clientes (
    ClienteID INT PRIMARY KEY,
    Nombre VARCHAR(100),
    Email VARCHAR(100)
);

-- Crear tabla Pedidos con clave foránea
CREATE TABLE Pedidos (
    PedidoID INT PRIMARY KEY,
    Fecha DATE,
    ClienteID INT,
    FOREIGN KEY (ClienteID) REFERENCES Clientes(ClienteID) ON DELETE CASCADE ON UPDATE CASCADE
);

-- Insertar registros en Clientes
INSERT INTO Clientes (ClienteID, Nombre, Email) VALUES (1, 'Juan Perez', '[email protected]');
INSERT INTO Clientes (ClienteID, Nombre, Email) VALUES (2, 'Ana Gomez', '[email protected]');

-- Intentar insertar un registro en Pedidos con un ClienteID inexistente
-- Esto fallará
INSERT INTO Pedidos (PedidoID, Fecha, ClienteID) VALUES (1, '2023-10-01', 3);

-- Insertar un registro válido en Pedidos
INSERT INTO Pedidos (PedidoID, Fecha, ClienteID) VALUES (2, '2023-10-02', 1);

-- Actualizar ClienteID en Clientes
-- Esto actualizará automáticamente el ClienteID en Pedidos
UPDATE Clientes SET ClienteID = 3 WHERE ClienteID = 1;

-- Eliminar un registro en Clientes
-- Esto eliminará automáticamente los registros relacionados en Pedidos
DELETE FROM Clientes WHERE ClienteID = 3;

Conclusión

La integridad referencial es crucial para mantener la coherencia y la validez de los datos en una base de datos relacional. Al comprender y aplicar correctamente las restricciones de integridad referencial, se pueden evitar errores y asegurar que las relaciones entre tablas se mantengan consistentes.

© Copyright 2024. Todos los derechos reservados