Ligaduras de Integridad y Restricciones sobre la BD Carlos A. Olarte carlosolarte@puj.edu.co 1 Introducción y Motivación • Por qué se deben validar los tipos de los atributos de las relaciones? • Por qué se debe validar el contenido de algunos atributos de relaciones? • Que pasa si se inserta un valor relacionado que no existe? • Que pasa si es borrado o actualizado un valor llave que sirve como llave foránea de otra relación? 2 Ligaduras de Dominio • Permiten la verificación de los valores introducidos en la base de datos • Permite examinar las consultas para que tengan sentido (Ej Edad >0 xyz 0 no es válido) • Permiten realizar chequeos de tipos como en los lenguajes de programación 3 Ejemplos en SQL • Los tipos son chequeados automáticamente • Las llaves de chequeo permiten restringir el dominio de un atributo: alter table personas add c o n s t r a i n t p e r s e x o c k check ( s e x o i n ( ’ F ’ , ’M ’ ) ) ; alter table productos add c o n s t r a i n t p r o c a n t i d a d c k check ( c a n t i d a d > 0 ) ; • Chequeo de Obligatoriedad: alter table personas m o d i f y nombre not n u l l ; Llaves Primarias (PKs) Las llaves primarias (primary key) identifican de manera única las tuplas de una relación y no pueden ser nulas. ALTER TABLE CIUDADES ADD CONSTRAINT CIU CODIGO PK PRIMARY KEY(CODIGO ) ; Llaves de Unicidad En ocasiones es deseable que el valor de un atributo no se repita. Si el atributo es PK, de éste chequeo se encarga la BD. De lo contrario debe hacerse explı́cito por medio de una restricción de unicidad. Por ejemplo: alter table cursos add c o n s t r a i n t c u r n o m b r e u k u n i q u e ( nombre ) ; Integridad Referencial Informalmente, es cuando un conjunto determinado de atributos de una relación aparece en otra. • Tupla Colgante:Se dice que tr es una tupla colgante de r si tr ∈ / r ./ s, es decir que no existe un ts tal que tr [R ∩ S] = ts[R ∩ S] Integridad Referencial Sea r1(R1) y r2(R2) dos relaciones con PKs k1 y k2. Se dice que un subconjunto α de R2 es una FK (Llave foránea) que hace referencia a k1 si se exige que para cada t2 de r2 hay una tupla en r1 tal que t1[k1] = t2[α]. Es decir: πα(r2) ⊆ πk1 (r1) En SQL: alter table ciudades add C o n s t r a i n t c i u p a i F K f o r e i g n key ( p a i i d ) references paises ( id ); Mantenimiento de la I.R Al insertar: Si se inserta t2 en r2, el SGBD debe asegurar que hay una tupla t1 en r1 tal que: t1[k] = t2[α]. Es decir: t2[α] ∈ πk (r1) Al Eliminar: Se debe constatar que el conjunto de tuplas relacionadas sea vació. De lo contrario se elimina en cascada o se retrocede la transacción. Al Actualizar: Si el atributo a modificar pertenece a la FK, se debe realizar el mismo chequeo como en el inserción Por otro lado, si se modifica la PK en r1, se debe realizar una comprobación similar a la de eliminación SQL Eliminación en cascada (no muy recomendable!) alter table . . . r e f e r e n c e s ON DELETE CASCADE ... Actualización en cascada: Alter table . . . r e f e r e n c e s ON UPDATE CASCADE ...