Está en la página 1de 31

Integridad de Datos

Referencia: Capítulo 11
Manual de Referencia SQL
James Grodd y Paul Weinberg
Integridad de Datos
 Hace referencia a la corrección y completitud de los
datos de una base de datos
 Cuando se modifica el contenido de una BD se puede
perder de muchas maneras la integridad de los datos
almacenados.
 Se pueden añadir datos no válidos
 Se pueden asignar valores incorrectos
Tipos de restricciones de integridad

1. Datos requeridos: Algunas columnas deben contener un valor de


datos válido en cada fila, no se permite que estén en blanco. (ejemplo
cada pedido, debe tener un cliente asociado que realice el pedido)
2. Comprobación de la validez: Cada columna tiene un dominio; es
decir un conjunto de valores que son legales para esa columna.
(ejemplo los empleados deben tener un código de empleado que oscila
entre 100 y 999)
3. Integridad de las entidades: La llave primaria para cada tabla debe
tener un valor único que no se repita y que sea diferente para el resto de
las filas
Tipos de restricciones de integridad

4. Integridad Referencial: Las llaves foráneas están asociadas a una


llave primaria. Las filas de la tabla que contienen la llave foránea
son hijos de la tabla que contiene la primaria. No deben haber
hijos huérfanos, es decir llaves foráneas que no aparezcan en la
tabla padre (PK).
5. Otras relaciones de datos: La situación modelada del mundo real
puede suponer restricciones adicionales que regulan los valores
legales de los datos; por ejemplo, podemos considerar que las
cuotas de ventas asignadas a un vendedor en un mes , no pueden
superar las cuotas asignadas al departamento.
Tipos de restricciones de integridad

6. Reglas del Negocio: El negocio puede tener reglas que regulan las actualizaciones permitidas, por
ejemplo; mis empleados no pueden trabajar mas de 30 horas extras en una quincena.
7. Consistencia: Muchas transacciones del mundo real provocan múltiples actualizaciones a la base de
datos.
Por ejemplo, el pedido de un cliente, supone la adición a la tabla de pedidos, el incremento en la columna de
ventas, la disminución en la tabla de productos y el incremento en la tabla vendedor por la venta realizada por
este empleado. Podemos pedir al DBMS que haga cumplir este tipo de reglas

+ -
Tabla
PEDIDO Tabla
+ PRODUCTO
+
CLIENTE hace Tabla Tabla
pedido VENTA VENDEDO
Restricciones de integridad del ANSI/ISO

No todas las restricciones listadas con anterioridad


forman parte del ANSI/ISO. La mayoría son
incluidas de manera uniforme en todos los paquetes
comerciales, sin embargo las restricciones como las
reglas del negocio y la consistencia utilizan una gran
variedad de sintaxis SQL para albergarlas.
Tipos de restricciones de integridad

1. Datos requeridos
2. Comprobación de la validez
3. Integridad de las entidades
4. Integridad Referencial
5. Otras relaciones de datos
6. Reglas del Negocio
7. Consistencia
1. RESTRICCIÓN DE DATOS
REQUERIDOS
 Exige que las columnas contengan valores que no sean NULL
 Se especifica en la instrucción Create table y se define a nivel de columna colocando NOT
NULL
 Cuando se declara una columna como NOT NULL el DBMS asegura que:
 Cada instrucción INSERT que añada filas nuevas a la tabla, debe especificar
un valor de dato que no sea NULL para esa columna. Si se intenta insertar un
Null para esa columna, se recibirá un mensaje de error.
 Cada instrucción UPDATE que actualice la columna debe asignarle un valor
de datos que no sea Null . Cualquier intento que no tenga datos genera error
 Se presenta inconveniente al querer colocar una restricción NOT NULL a una tabla existente, ya
que para el manejo de los not null el DBMS utiliza un byte extra que no se encuentra en esta tabla
con datos.
Tipos de restricciones de integridad

1. Datos requeridos
2. Comprobación de la validez
3. Integridad de las entidades
4. Integridad Referencial
5. Otras relaciones de datos
6. Reglas del Negocio
7. Consistencia
2. COMPROBACIÓN DE LA VALIDEZ

 2.1 Comprobación sencilla:


 La brinda el tipo de dato asignado a la columna al
momento de la creación de la tabla, por Ejemplo: si
definimos el campo edad como integer no se podrán
introducir caracteres.
 2.2 Comprobación de columnas CHECK:
 Es definida al momento de la Creación de la tabla. El
DBMS comprueba al valor de la columna cada vez que
se inserta o actualiza la tabla. En caso de no
cumplirse, el insert o update falla.
2.2 Comprobación de columnas CHECK:
CREATE TABLE VENDEDOR
( num_empl integer not null
constraint vendedor_num_empl_pk primary key
constraint vendedor_num_emp_ck CHECK ( num_empl between 101 and 199 ),
nombre varchar(30),
tipo_sangre char(3)
constraint vendedor_tipo_sangre_DF default 'O+'
constraint vendedor_tipo_sangre_ck
CHECK (tipo_sangre in ('A+','A-','B+','B-','O+','O-','AB+','AB-')),
cuota money
constraint vendedor_cuota_ck CHECK ( cuota >=0.01)
)
Tipos de restricciones de integridad

1. Datos requeridos
2. Comprobación de la validez
3. Integridad de las entidades
4. Integridad Referencial
5. Otras relaciones de datos
6. Reglas del Negocio
7. Consistencia
3. INTEGRIDAD DE LAS ENTIDADES

 El estándar del ANSI señala que todas las tablas deben tener una llave primaria.

 Cuando se define una llave primaria (PRIMARY KEY) el DBMS comprueba


que no se repitan los valores dentro de la tabla cuando realizamos INSERT o
UPDATE sobre ellas.

 Cada columna declarada como PK debe ser NOT NULL para cumplir con la
norma ANSI/ISO.
 Observación (Algunos manejadores lo asume por default (ej: SQL Server), pero no todos
los manejadores de BD asumen que la PK es not null)
Tipos de restricciones de integridad

1. Datos requeridos
2. Comprobación de la validez
3. Integridad de las entidades
4. Integridad Referencial
5. Otras relaciones de datos
6. Reglas del Negocio
7. Consistencia
4. INTEGRIDAD REFERENCIAL

 Hace referencia a las relaciones


que se crean al definir llaves
foráneas al momento de la
creación de las tablas.
 En este caso, tenemos la relación
entre el empleado (persona) que
es la tabla padre ya que tiene la
llave primaria y las órdenes que
debe atender o procesar esta
persona (tabla hijo) con la llave
foránea
4. INTEGRIDAD REFERENCIAL

Problemas de Integridad Referencial

a. Inserción de una Fila Hijo nueva

b. Actualización de la llave foránea de una fila hijo

c. Eliminación de una fila padre

d. Actualización de la clave primaria de una fila


padre
4. INTEGRIDAD REFERENCIAL

a. Inserción de una Fila Hijo nueva

FK

El id_persona de la tabla personas esta definida como FK


en la tabla ordenes (persona)
PK

El número 7, no es un número válido en persona, por lo


que al intentar insertarlo en la tabla órdenes, se genera un
conflicto y se aborta la insersión.
4. INTEGRIDAD REFERENCIAL

a. Inserción de una Fila Hijo nueva

 El valor de la llave foránea (tabla hijo), debe


coincidir con un uno de los valores de la tabla F Tabla hijo
K
donde es primaria (padre).
 Si la llave foránea no coincide con ninguno de la
tabla padre, se deteriora la BD ya que habrá un PK
hijo sin padre (huérfano).
4. INTEGRIDAD REFERENCIAL

Inserción de una Fila Padre nueva

F
K

Tabla hijo
PK

La inserción en la tabla padre no supone ningún error


4. INTEGRIDAD REFERENCIAL

b. Actualización de la llave foránea de una fila hijo

F
K

Tabla hijo Si queremos modificar la llave foránea, y


esta no coincide con ninguno de la tabla
padre, se deteriora la BD ya que habría un
hijo sin padre (huérfano), por tanto no
permite el cambio.
4. INTEGRIDAD REFERENCIAL

c. Eliminación de una Fila Padre

Si se elimina en la tabla padre a una fila que


tenga uno o varios hijos, las filas hijos se
transformarían en huérfanos, por lo cual la
restricción de integridad referencial impide
que se realice la eliminación.
4. INTEGRIDAD REFERENCIAL

d. Eliminación de una Fila Padre sin hijos

La persona con id igual a 4, no tiene hijos en la


tabla Ordenes, por lo cual podemos eliminarlo sin
problemas
4. INTEGRIDAD REFERENCIAL

d. Actualización de la llave primaria de una fila padre

PK

FK

Si se modifica la llave primaria de un padre, todos los hijos se


transformarían en huérfanos ; por lo que no se permite la
actualización.
4. INTEGRIDAD REFERENCIAL

c. Eliminación de una Fila Padre,


que hacer con los hijos
Considerar las posible opciones:

1. Evitar que se elimine la persona, hasta que se hayan


reasignado el valor de la persona responsable de dicha
orden ó,
2. Eliminar de manera automática la orden o las órdenes
cuyo responsable se desea eliminar ó
3. Definir la columna persona (FK) de las órdenes cuyo
responsable deseamos eliminar como null indicando que
no tiene persona responsable por el momento.
4. Definir la columna persona(FK) de las órdenes con algún
valor predeterminado, asignando siempre a un mismo
responsable en estos casos
Reglas de Eliminación de filas de la tabla padre
RESTRICT: Evita que se elimine una fila de la tabla padre si esta tiene hijos. Las
instrucciones delete se rechazarán con un mensaje de error. De este modo se restringen
las eliminaciones de la tabla padre a las filas sin hijos.
Para el ejemplo en cuestión, tendríamos el equivalente a decir que no se puede eliminar
una persona que tenga ordenes asignadas
Observación:
• Hay manejadores que no manejan la regla Restrict, en su lugar utiliza la regla
NO ACTION
• Otros manejadores soportan ambas reglas: Restrict y No Action
Esta es la regla por default en caso de no especificar ninguna

CASCADE: Al eliminar una fila padre, se elimina automáticamente de la tabla


hijo, todas sus filas hijos.
Para el ejemplo en cuestión, tendríamos el equivalente a decir que al eliminar a una
persona, eliminamos automáticamente todas las órdenes asignadas a él.
Reglas de Eliminación de filas de la tabla padre

SET NULL: Sitúa automáticamente a NULL el valor de las llaves


foráneas cuyo padre este siendo eliminado.
Para el ejemplo en cuestión, tendríamos el equivalente a decir que si se
elimina una persona, desconocemos quien se encarga de sus órdenes.

SET DEFAULT: Cuando se elimina una fila padre, el valor de la llave


foránea en la tabla hijo, será definida automáticamente con el valor
predeterminado en la columna concreta.
Para el ejemplo en cuestión, tendríamos el equivalente a decir que si se
elimina una persona, el valor que se ha colocado como default ( que debe ser
una llave primaria válida y que existe en la tabla padre) será el asumido para
esta columna.
Observación: Hay manejadores que no manejan el SET DEFAULT
create table Empleado De nuestro primer laboratorio
(… nd int not null
constraint empleado_nd_df DEFAULT 1,

constraint pk_empleado_nss primary key (nss),
constraint fk_empleado_superv foreign key (nss_superv)
references Empleado(nss)
ON DELETE SET NULL ON UPDATE CASCADE )
 En caso de que al insertar datos el valor nd sea nulo, el manejador de base de datos asume 1

 En caso de que se borre la llave primaria (nss de la tabla empleado), el FK del numero del
supervisor (nss_superv), se colocará en NULL para todas los empleados cuyo supervisor
(nss_superv) esta siendo borrado. (recuerde que esta era una entidad recursiva).

 En caso de que se actualice la llave primaria (nss), el numero del supervisor (nss_superv), es
cambiado automáticamente por este nuevo valor, en cada fila que este contenido
De nuestro primer laboratorio
create table Localizacion_Dept
(…
constraint pk_localización_dept numerod_localizaciond
primary key (numerod, localizaciond),
constraint fk_localización_dept_numerod
foreign key (numerod)
references Departamento(numerod)
ON DELETE CASCADE ON UPDATE CASCADE
En caso de que se borre la llave primaria (numerod) de la tabla departamento,
Se borraran todos los numerod ( FK) de la tabla localizaciones_dept que
correspondan a la llave primaria borrada

Si actualizamos la llave primaria (numerod) de la tabla departamento,


el FK del numero de departamento de la tabla localizaciones_dept (numerod),
tomará automáticamente el mismo valor que le estamos dando al numerod en la
tabla departamento
EN GENERAL…

ON DELETE ON UPDATE
 SET NULL Y SET DEFAULT:  SET NULL Y SET DEFAULT: El
El valor de los atributos valor de los atributos referenciados
referenciados cambia a null en el cambia a null en el caso del set null y
caso del set null y al valor al vlor especificado en el caso de
especificado en el caso de default default
 CASCADE: Elimina todas las  CASCADE: Cambia el valor de la
tuplas (filas) referenciadas llave foránea al valor de la nueva
llave primaria en todas las tuplas

La opción CASCADE es la recomendada para tablas de relación (que


surgen por relaciones M a M)
Tipos de restricciones de integridad

1. Datos requeridos
2. Comprobación de la validez
3. Integridad de las entidades
4. Integridad Referencial
5. Otras relaciones de datos
6. Reglas del Negocio
7. Consistencia
5. Otras relaciones de datos

 DISPARADORES O TRIGGERS : Serán abordados posteriormente

También podría gustarte