Manual del estudiante de Ingeniería en Sistemas de UTN/Bases de datos avanzadas/Integridad de los datos

Una restricción de integridad es un método declarativo para definir una regla sobre una columna o conjunto de columnas de una tabla.

Si cualquier resultado de una sentencia DML viola una restricción de integridad, ORACLE vuelve atrás la sentencia y retorna un error.

Las ventajas que presentan las restricciones de integridad sobre otros métodos para definir reglas (triggers, procedimientos, funciones) son:

  • Simplicidad de su definición.
  • Centralización de las restricciones de integridad: se definen sobre las tablas y se almacenan en el diccionario de datos, lo cual facilita la modificación.
  • Mejor performance: el optimizador de consultas de ORACLE se emplea cada vez que se define una regla de integridad.

Tipos de integridad

editar
Nulls
Es una regla que permite o no la inserción o modificación de una fila con un valor nulo (null) sobre una columna.
Columnas con valor único (Unique values)
Permite la inserción o actualización de una fila solo si contiene un valor único sobre esa columna o conjunto de columnas.
Clave Primaria (Primary Key)
especifica que cada fila de la tabla puede ser identificada con los valores de la columna o conjunto de columnas).
Integridad Referencial
permite la inserción o actualización de una fila si el valor de la columna o conjunto de columnas, que se denomina el valor dependiente, tiene un valor igual en la tabla relacionada. La integridad referencial también incluye las reglas que dictaminan la manipulación de datos que está permitida sobre los valores referenciados y como estas acciones afectan los valores dependientes. Las reglas asociadas con la integridad referencial son:
  • Restrict: no permite la actualización o eliminación de los datos referenciados.
  • Set to null: cuando los datos referenciados se actualizan o eliminan, todos los datos dependientes se ponen en Null.
  • Set to default: cuando los datos referenciados se actualizan o borran, todos los datos dependientes se ponen en el valor default.
  • Cascade: cuando los datos referenciados se actualizan o eliminan, todos los datos dependientes correspondientes se actualizan o eliminan.
Chequeos de integridad
son reglas definidas por el usuario para una columna o conjunto de columnas que permiten o no la actualización, inserción o eliminación de una fila basado en el valor de la columna o conjunto de columnas.

Not null

editar

Por omisión, todas las columnas en un a tabla permiten valores nulos. Una restricción de NOT NULL establece que ningún valor nulo pueda incluirse en una columna.

Unique key

editar

Una restricción de integridad UNIQUE KEY sobre una columna o conjunto de columnas define que dos filas de la tabla no pueden contener los mismos valores en esa columna o conjunto de columnas.

Si la restricción de UNIQUE key abarca varias columnas se dice que el grupo de columnas tiene una clave única compuesta. Para que dos valores de una clave compuesta se consideren duplicados, los valores de TODAS sus columnas deben ser iguales.

Ejemplos de definición de restricciones de unicidad:

CREATE TABLE supplier

(	supplier_id	numeric(10)	not null,
supplier_name	varchar2(50)	not null,
contact_name	varchar2(50),	
CONSTRAINT supplier_unique UNIQUE (supplier_id, supplier_name)
);

Utilizando ALTER:

ALTER TABLE supplier
add CONSTRAINT supplier_unique UNIQUE (supplier_id);

ORACLE obliga a que toda restricción de integridad de UNIQUE KEY contenga un índice, por lo tanto la restricciones de integridad de este tipo tienen las misma limitaciones impuestas a los índices compuestos: hasta 16 columnas y la medida en bytes de la clave compuesta no puede exceder aproximadamente la mitad de la medida del bloque de base de datos.

En la combinación de restricciones de clave única y valores nulos, se debe tener en cuenta que no se pueden tener iguales valores no-nulos en las columnas especificadas con restricciones UNIQUE KEY y valores nulos.

Primary key

editar

Cada tabla de la base de datos debe tener a lo sumo una restricción PRIMARY Key. Los valores en el grupo de una o más columnas que están sujetas a esta restricción constituyen el identificador único de la fila. La principal diferencia con la restricción de UNIQUE Key es que las columnas de la clave primaria no pueden contener valores nulos.

ORACLE obliga a que toda restricción de integridad PRIMARY key contenga un índice.

Foreign key (Integridad Referencial)

editar

Distintas tablas en una base de datos pueden estar relacionadas por columnas comunes.

Definiciones

editar
Clave foránea
La columna o conjunto de columnas que hacen referencia a una clave referenciada. La tabla que contenga esta clave se llamará tabla dependiente.
Clave referenciada
la clave única (unique key) o la clave primaria (primary key) de la misma tabla o de un a tabla diferente que es referenciada por una clave foránea. La tabla que contenga esta clave se llamará tabla referenciada.

Una restricción de integridad referencial requiere que cada fila de la tabla dependiente contenga un valor de clave foránea que sea igual a un valor de clave única o primaria en la tabla padre.

El modelo relacional permite que el valor de una clave foránea o sea igual al valor de la clave referenciada, o sea nulo. Existen muchas interpretaciones sobre este hecho cuando se habla de claves foráneas compuestas. Las reglas que se pueden aplicar en este caso son:

match full
No se permiten claves foráneas con valores nulos parciales. O todos los componentes de la clave foránea deben ser nulos, o la combinación de valores contenidos en la clave foránea deben aparecer como clave primaria o única de una fila de la tabla referenciada.
match partial
Se permiten claves foráneas con valores nulos parciales. O todos los componentes de la clave foránea deben ser nulos, o la combinación de valores no-nulos contenidos en la clave foránea debe aparecer en la porción correspondiente como clave primaria o única de una fila de la tabla referenciada.
match none
se permiten valores de claves foráneas compuestas parcialmente nulas. Si cualquier columna de una clave foránea es nula, luego, la porción no-nula de la clave no tiene que tener un valor correspondiente en la clave padre.

En las restricciones de integridad referencial se deben especificar las acciones que se realizarán en las filas dependientes si una clave de la tabla padre es modificada. Las opciones que soporta Oracle son:

  • UPDATE RESTRICT
  • DELETE RESTRICT

Esta opción define que los valores de la clave referenciada no pueden ser actualizados o eliminados si los datos resultantes violan las restricciones de integridad referencial.

  • DELETE CASCADE

Esta opción especifica que cuando las filas que contienen la clave referenciada son eliminadas, todas las filas de las claves foráneas dependientes también serán eliminadas.

Las acciones que no están soportadas por las restricciones de integridad referencial deben ser realizadas por medio de triggers.

Check integrity

editar

La verificación de una restricción de integridad sobre una columna o conjunto de columnas requiere que una condición especificada sea verdadera o desconocida para todas las filas de una tabla. Si una sentencia DML resulta que la condición de la verificación de integridad se evalúa en falsa la sentencia se vuelve atrás (rolled-back).

La condición tiene algunas limitaciones:

  • Debe ser una expresión booleana evaluada usando los valores de la fila que se inserta o actualiza.
  • No puede contener subconsultas, secuencias, ni funciones SQL SYSDATE, UID, USER o USERENV ni pseudocolumnas LEVEL o ROWNUM.

Una columna simple puede tener múltiples restricciones que se deben verificar y que contienen a la columna en su definición.

Difiriendo las verificaciones

editar

Se pueden diferir las verificaciones de las condiciones para que se hagan al final de una transacción.

  • Una restricción es diferida (deferred) si el sistema chequea si la restricción se satisface cuando la transacción es cometida. Si la condición es violada entonces el commit hace que la transacción vuelva atrás (rolled back).
  • Si una restricción es inmediata (not deferred) esta se chequea al final de cada sentencia. Si es violada la sentencia se vuelve atrás inmediatamente.

Si una restricción causa una acción (por ejemplo, DELETE CASCADE) la acción es siempre realizada como parte de la sentencia que la causa, independientemente si la restricción es diferida o inmediata.

Los atributos de las restricciones que se pueden especificar en la cláusula CONSTRAINTS son:

  • DEFERRABLE o NOT DEFERRABLE
  • INITIALLY DEFERRED o INITIALLY INMEDIATE

Las definiciones de los restricciones de integridad se realizan en la creación de tablas (CREATE TABLE) o cuando se altera una tabla (ALTER TABLE) y se pueden declarar para la tabla o cuando se define una columna específicamente.

La especificación de los parámetros de los chequeos de integridad se realizan con la sentencia SET CONSTRAINTS donde se especifica si la restricción será un DEFERRED o INMEDIATE.