La integridad referencial es propiedad de la base de datos. La misma significa que la clave externa de una tabla de referencia siempre debe aludir a una fila válida de la tabla a la que se haga referencia. La integridad referencial garantiza que la relación entre dos tablas permanezca sincronizada durante las operaciones de actualización y eliminación.

Todas las bases de datos relacionales gozan de esta propiedad gracias a que el software gestor de base de datos vela por su cumplimiento. En cambio, las bases de datos jerárquicas requieren que los programadores se aseguren de mantener tal propiedad en sus programas.

Ejemplo: Cómo funciona

Supongamos una base de datos con las entidades Persona y Factura. Toda factura corresponde a una persona y solamente una. Implica que en todo momento dichos datos sean correctos, sin repeticiones innecesarias, datos perdidos y relaciones mal resueltas.

Supongamos que una persona se identifica por su atributo RFC(Registro Federal del Contribuyente). También tendrá otros atributos como el nombre y la dirección. La entidad Factura debe tener un atributo RFC_cliente que identifique a quién pertenece la factura.

Por sentido común es evidente que todo valor de RFC Cliente debe corresponder con algún valor existente del atributo RFC de la entidad Persona. Esta es la idea intuitiva de la integridad referencial.

Por ejemplo vamos a relacionar un id de cliente con la información de la tabla factura

Creamos la tabla cliente

CREATE TABLE `clientes` ( `id` INT NOT NULL AUTO_INCREMENT , `nombres` VARCHAR(128) NULL , `RFC` VARCHAR(16) NULL , `direccion` VARCHAR(16) NULL , PRIMARY KEY (`id`)) ENGINE = InnoDB;

Luego Creamos la tabla ventas

CREATE TABLE `ventas` ( `id` INT NOT NULL AUTO_INCREMENT , `idCliente` INT NULL , `Concepto` VARCHAR(128) NULL , `total` DECIMAL(18,2) NOT NULL , PRIMARY KEY (`id`)) ENGINE = InnoDB;

Agregamos la restricción para que al eliminar un cliente no permita eliminar si este cliente ya tiene una venta

ALTER TABLE `ventas` ADD CONSTRAINT `rstCliente` FOREIGN KEY (`idCliente`) REFERENCES `clientes`(`id`) ON DELETE RESTRICT ON UPDATE RESTRICT;

Insertamos datos en la tabla cliente

INSERT INTO `clientes` (`id`, `nombres`, `RFC`, `direccion`) VALUES (NULL, 'Julio', 'xxx', 'conocido'), (NULL, 'kakaroto', 'xxe', 'vegita');

Insertamos en la tabla ventas

INSERT INTO `ventas` (`id`, `idCliente`, `Concepto`, `total`) VALUES (NULL, '1', 'venta de equipo de computo', '10000'), (NULL, '2', 'Venta de semillas del hermitaño', '5')

Ahora intentamos eliminar el cliente kakaroto

delete from clientes where id=2

Si hicimos las cosas bien la base de datos se protegerá y no se podrá eliminar el cliente por la restricción de llave foránea, saldrá el siguiente mensaje

#1451 - Cannot delete or update a parent row: a foreign key constraint fails (`pos`.`ventas`, CONSTRAINT `rstCliente` FOREIGN KEY (`idCliente`) REFERENCES `clientes` (`id`))