Bases de Datos

Integridad referencial

Integridad Referencial en Bases de Datos

La integridad referencial es un sistema de reglas que utilizan la mayoría de las bases de datos relacionales para asegurarse que los registros de tablas relacionadas son válidos y que no se borren o cambien datos relacionados de forma accidental produciendo errores de integridad.

La integridad referencial es una funcionalidad disponible en las bases de datos relacionales que garantiza la coherencia de datos entre relaciones aparejadas. Siempre se deberia usar para garantizar la integridad de los datos.

Una clave foránea es un campo de una tabla que contiene una referencia a un registro de otra tabla.

Cuando se define una columna como clave foránea, las filas de la tabla pueden contener en esa columna un valor nulo o un valor que existe en la otra tabla. La integridad referencial consiste en que los datos que referencian a otros deben ser correctos.

Esta integridad referencial hace que el sistema gestor de la base de datos se asegure de que no hayan valores que no estén en la tabla principal.

La integridad referencial se activa en cuanto creamos una clave foránea. A partir de ese momento se comprueba cada vez que se modifiquen datos que puedan alterarla.

Se produciría un error cuando insertamos una nueva fila en la tabla secundaria y el valor de la clave foránea no existe en la tabla principal.

Tipos de relaciones

Entre dos tablas pueden existir dos tipos de relaciones:

  • Uno a Uno
  • Uno a Muchos
  • Varios a Varios

Relación Uno a Uno

Cuando un registro de una tabla sólo puede estar relacionado con un único registro de la otra tabla y viceversa.

Relación Uno a muchos

Cuando un registro de una tabla (tabla secundaria) sólo puede estar relacionado con un único registro de la otra tabla (tabla principal) y un registro de la tabla principal puede tener más de un registro relacionado en la tabla secundaria, en este caso se suele hacer referencia a la tabla principal como tabla ‘padre’ y a la tabla secundaria como tabla ‘hijo’, entonces la regla se convierte en ‘un padre puede tener varios hijos pero un hijo solo tiene un padre.

Relación Varios a Varios

Cuando un registro de una tabla puede estar relacionado con más de un registro de la otra tabla y viceversa. En este caso las dos tablas no pueden estar relacionadas directamente, se tiene que añadir una tabla entre las dos que incluya los pares de valores relacionados entre sí.

Integridad referencial en cascada

Cuando queremos borrar una fila de la tabla principal y ese registro tiene ‘hijos’ tenemos dos alternativas: no dejar borrar el registro de la tabla principal o borrarlo y poner a valor nulo en todos sus ‘hijos’.

El actualizar y/o eliminar registros en cascada, son opciones que se definen cuando definimos la clave foránea y que le indican al sistema gestor qué hacer en los casos comentados en el punto anterior.

Actualizar registros en cascada

Esta opción le indica al sistema gestor de la base de datos que cuando se cambie un valor del campo clave de la tabla principal, automáticamente cambiará el valor de la clave foránea de los registros relacionados en la tabla secundaria.

Si no se tiene definida esta opción, no se puede cambiar los valores de la clave principal de la tabla principal.

Si intentamos cambiar el valor de una clave principal con hijos enotras tablas no se producirá el cambio y el sistema nos devolverá un error o un mensaje que los registros no se han podido modificar por infracciones de clave.

Eliminar registros en cascada

Esta opción le indica al sistema gestor de la base de datos que cuando se elimina un registro de la tabla principal automáticamente se borran también los registros relacionados en la tabla secundaria.

Si no se definine no se pueden borrar registros de la tabla principal si estos tienen registros relacionados en la tabla secundaria.

Si intentaramos borrar un registro no se producirá el borrado y el sistema nos devuelve un error o un mensaje que los registros no se han podido eliminar por infracciones de clave.

Como aplicar integridad referencial

La integridad referencial se define con el uso combinado de claves primarias (primary keys) ó claves candidatas (candidate key) y clave foráneas (foreign key).

Las claves primarias y candidatas están formadas por valores únicos y una clave foránea solamente puede estar asociada a una de estas para garantizar la existencia de un solo valor correcto.

Las claves candidatas se pueden definir creando un índice único (CREATE UNIQUE INDEX ….) en la columna pertinente.

Para poder usar esta funcionalidad es importante tener nuestra base de datos normalizada.

De este modo podremos evitar los siguientes problemas:

  • Evitar la redundancia de los datos.
  • Evitar problemas de actualización de los datos en las tablas.
  • Proteger la integridad de los datos.

Nada mejor que un simple ejemplo para ver como podemos implementar la teoria con unos simples comandos.

Si tenemos dos tablas: Una de clientes, con dos atributos, un número identificador y un nombre. Otra tabla para facturas con el número de factura y el número de cliente.

Si no utilizaramos integridad referencial e intentaramos insertar un registro de factura a un cliente inexistente o queremos borrar un cliente que ya posee registros en facturas podriamos realizarlo sin ningún tipo de problema. El inconveniente es que nuestra base de datos no seria confiable por falta de consistencia de datos.

Esto se puede solucionar creando una clave primaria en el atributo ID de la tabla clientes y una clave foránea en el atributo CLIENTE de la tabla facturas.

Esto lo podemos hacer cuando definamos la tabla ó con los siguientes comandos para la clave primaria:

ALTER TABLE clientes ADD CONSTRAINT cliente_pk PRIMARY KEY (id);

Y para la foránea, por ejemplo:

ALTER TABLE facturas ADD CONSTRAINT clientes_id_fk FOREIGN KEY (cliente)
REFERENCES clientes(id) MATCH FULL ON DELETE RESTRICT ON UPDATE CASCADE;

Esto seria suficiente para implementar integridad referencial en las dos tablas de nuestro ejemplo. Si intentamos hacer algo ilegal con nuestros datos, la base de datos nos lo prohibirá y nos dará un error.

Hay tres parametros cuando definimos una clave foránea que son muy importantes y que definen como la base de datos se va a comportar para salvaguardar la integridad de nuestros datos. Estos parametros son:

MATCH tipo
ON DELETE accion
ON UPDATE accion

En donde tipo puede tener estos valores:

  • FULL: No permite que una columna tenga el valor NULL en una clave foránea compuesta por varias columnas
  • SIMPLE: Permite que una columna tenga el valor NULL en una clave foránea compuesta por varias columnas

Y accion puede tener estos valores:

  • NO ACTION: Produce un error indicando que un DELETE ó UPDATE creará una violación de la clave foránea definida.
  • RESTRICT: Produce un error indicando que un DELETE ó UPDATE creará una violación de la clave foránea definida.
  • CASCADE: Borra ó actualiza automáticamente todas las referencias activas
  • SET NULL: Define las referencias activas como NULL
  • SET DEFAULT: Define las referencias activas como el valor por defecto (si está definido) de las mismas

Most Popular

To Top