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`))
1 pingback