Restricciones de Integridad Amparo López Gaona México, D.F. Semestre 2000-I Restricciones de Integridad Restricciones de Integridad Las principales restricciones de integridad que pueden indicarse son: La clave primaria. Claves candidatas. Claves externas. Valores no nulos. Verificación de cierta condición. ° c Amparo López Gaona, 2003 Transparencia No. 1 Restricciones de Integridad Claves Primarias Existen dos formas de definir una clave primaria al crear una tabla: Al definir el elemento especificar que será clave primaria: CREATE TABLE persona ( nombre CHAR(30) PRIMARY KEY, dir VARCHAR(200), sexo CHAR(1), fechanac DATE ); Agregar una declaración al final de la lista de atributos. CREATE TABLE persona ( nombre CHAR(30), dir VARCHAR(200), sexo CHAR(1), fechanac DATE, PRIMARY KEY (nombre) ); ° c Amparo López Gaona, 2003 Transparencia No. 2 Restricciones de Integridad Otra forma de definir claves es usando la palabra UNIQUE. Esta puede aparecer todas las veces que se desee. CREATE TABLE persona ( nombre CHAR(30) PRIMARY KEY, dir VARCHAR(200), teléfono CHAR(8) UNIQUE, sexo CHAR(1), fechanac DATE ); ° c Amparo López Gaona, 2003 Transparencia No. 3 Restricciones de Integridad Índices Un ı́ndice sobre un atributo A es una estructura de datos para hacer eficiente la localización de tuplas cuando se hacen búsquedas sobre un atributo. SELECT * FROM sucursal WHERE ciudad = ’Villahermosa’ AND activo >= xxx; CREATE INDEX nombre ı́ndice ON tabla(atributos) Se crea un ı́ndice con el nombre dado, con el cual las consultas que involucran a esos atributos se verán reducidas en el tiempo que requieren para contestarla. Ventaja. Se agilizan las consultas. Desventajas: • Crear y mantener un ı́ndice toma tiempo y espacio sobre la BD. • Se complican las inserciones, supresiones y actualizaciones de tuplas. ° c Amparo López Gaona, 2003 Transparencia No. 4 Restricciones de Integridad Es normal declarar ı́ndices sobre las claves o atributos únicos. CREATE INDEX IndNombre ON persona(nombre); CREATE UNIQUE INDEX IndTel ON persona(teléfono); Aunque es tarea difı́cil, se presentan una guı́as para crear ı́ndices: Las columnas que forman clave. Las columnas que con frecuencia se usan en joins. Las columnas que con frecuencia se usan en orden. Los ı́ndices no son útiles en: Columnas que rara vez se consultan sus valores. Columnas que tienen un dominio muy limitado. Ejemplo: sexo. Tablas pequeñas. DROP INDEX nombre ı́ndice ° c Amparo López Gaona, 2003 Transparencia No. 5 Restricciones de Integridad Claves externas Hacer referencia en R1 a un atributo que es clave en otra relación R2 tiene como consecuencias: Los atributos referenciados de la segunda relación deben ser clave primaria. Cualquier valor de atributo en R1, debe aparecer en R2. Formas de declarar las claves externas: Si sólo tiene un atributo basta con terminar su declaración con REFERENCES tabla (atributo) donde el atributo es la clave en la tabla especificada. CREATE TABLE sucursal ( nombre_suc char(20) PRIMARY KEY, ciudad char(30), activo int); ° c Amparo López Gaona, 2003 Transparencia No. 6 Restricciones de Integridad CREATE TABLE cuenta ( nombre_suc char(20) REFERENCES sucursal (nombre_suc), num_cuenta DomCuenta PRIMARY KEY, saldo int); Especificarlo en la lista de restricciones. FOREIGN KEY atributos REFERENCES tabla (atributos) CREATE TABLE cuenta ( nombre_suc char(20); num_cuenta DomCuenta PRIMARY KEY, saldo int, FOREIGN KEY nombre_suc REFERENCES sucursal (nombre_suc)); Todo valor de nombre suc en cuenta debe estar en la relación sucursal. ° c Amparo López Gaona, 2003 Transparencia No. 7 Restricciones de Integridad Existen tres alternativas para mantener las claves externas: 1. Polı́tica por omisión. Rechazar las modificaciones que signifiquen violación a la integridad referencial. Al tratar de insertar un nueva cuenta cuyo valor de sucursal no sea NULL y no esté en la relación sucursal. Al tratar de actualizar una cuenta cambiando el componente de la sucursal a uno no existente. Al tratar de borrar de sucursal una tupla cuyo valor aparezca en al menos una tupla de cuenta. Al tratar de actualizar una tupla de sucursal y se caiga en caso anterior. 2. Polı́tica de cascada. Al suprimir una tupla cuyo valor sea referenciado desde otra relación, para mantener la integridad referencial se eliminan la tuplas referenciantes. Al actualizar el valor de una tupla en sucursal se actualizan las de cuenta. ° c Amparo López Gaona, 2003 Transparencia No. 8 Restricciones de Integridad 3. Asignación de nulos. Al cambiar un valor en el nombre de la sucursal referenciada, se asigna NULL en las relaciones referenciantes. El usuario puede elegir de manera independiente que hacer: CREATE TABLE cuenta ( nombre_suc char(20); num_cuenta DomCuenta PRIMARY KEY, saldo int, FOREIGN KEY nombre_suc REFERENCES sucursal (nombre_suc) ON DELETE SET NULL ON UPDATE CASCADE); ° c Amparo López Gaona, 2003 Transparencia No. 9 Restricciones de Integridad Restricciones al valor de los atributos Restricciones de dominios para un atributo: • Valores no nulos. • Especificación de valores en la definición de un atributo. • Especificación de valores en la definición del dominio. Restricciones sobre tuplas. Restricciones sobre relaciones. ° c Amparo López Gaona, 2003 Transparencia No. 10 Restricciones de Integridad Valores nulos Al insertar una tupla sin especificar todos los campos se introduce un valor NULL, a menos que haya un valor por omisión. “Desconozco el valor de un atributo pero existe o existirá” Si se desea evitar la inserción de nulos se debe especificar en la creación de la relación: CREATE TABLE persona ( nombre CHAR(30) PRIMARY KEY, dir VARCHAR(200), teléfono CHAR(8) NOT NULL ); No se puede no especificar el teléfono al insertar una tupla. No se puede modificar el teléfono a nulo. ° c Amparo López Gaona, 2003 Transparencia No. 11 Restricciones de Integridad Reglas importantes para tratar con los nulos. NULL no es una constante, por tanto no puede usarse como operando. Excepto: SELECT núm_préstamo FROM préstamo WHERE importe IS NULL; El resultado de una operación aritmética es nulo si cualquiera de los operandos es nulo. Las operaciones de agregación ignoran los valores nulos, con lo cual puede resultar vacı́a en cuyo caso devuelven nulo, excepto COUNT(*) que regresa cero. SELECT SUM(importe) FROM préstamo; Las operaciones lógicas que involucran nulos, lo consideran como falso, y da como resultado desconocido, lo cual no es cierto ni falso. ° c Amparo López Gaona, 2003 Transparencia No. 12 Restricciones de Integridad Reglas para el tratamiento de desconocidos en operaciones lógicas: x true true false false y true false true false x AND y true false false false x OR y true true true false NOT x false false true true true unknown false unknown unknown unknown true unknown false unknown unknown unknown false false unknown true true unknown unknown unknown false unknown true unknown unknown En la clausula WHERE se produce uno de estos tres valores pero sólo trabaja con las tuplas que producen verdadero. ° c Amparo López Gaona, 2003 Transparencia No. 13 Restricciones de Integridad SELECT * FROM prestamo WHERE importe <= 10000 OR importe > 10000; SELECT * FROM prestamo; Son distintos si hay al menos una tupla con importe = NULL ° c Amparo López Gaona, 2003 Transparencia No. 14 Restricciones de Integridad Restricciones basadas en un atributo CHECK (condición) La condición puede ser cualquiera que pueda aparecer en la clausula WHERE, es decir puede tener operadores lógicos, de comparación, LIKE, IN, BETWEEN, etc. Se verifica cada vez que se modifica el valor de ese atributo. Si no se cumple la condición se rechaza la modificación. Ejemplo: CREATE TABLE persona ( nombre CHAR(30), dir VARCHAR(200), teléfono CHAR(8) CHECK (teléfono LIKE ’5-------’), sexo CHAR(1) CHECK (sexo IN (’F’, ’M’)) ); ° c Amparo López Gaona, 2003 Transparencia No. 15 Restricciones de Integridad Si se desea usar otros atributos o tuplas de la relación, o de otras relaciones, la condición debe ser una subconsulta. Estudio (nombe, dirección, curp_pres) Ejecutivo (nombre, dirección, curp, sueldo) CREATE TABLE Estudio ( nombre CHAR(40) PRIMARY KEY, dirección VARCHAR(255), sueldo INT, curp_pres INT CHECK (curp IN (SELECT curp FROM ejecutivo)) ) La validación es correcta y es como restricción de integridad referencial, excepto: la validación se realiza sólo al agregar/modificar una tupla de Estudio, no al suprimir una tupla de ejecutivo ° c Amparo López Gaona, 2003 Transparencia No. 16 Restricciones de Integridad Restricciones de dominio Es similar al punto anterior excepto que no se sabe cuál atributo tomará valores de ese dominio, en ese caso se escribe la palabra VALUE CREATE DOMAIN domSexo CHAR(1) CHECK (VALUE IN (’F’, ’M’)); sexo domSexo, CREATE DOMAIN domP INT CHECK ( VALUE >= 1000); ° c Amparo López Gaona, 2003 Transparencia No. 17 Restricciones de Integridad Restricciones globales Restricciones que involucran relación entre varios atributos o entre diferentes relaciones. Restricciones basadas en tupla. Afirmaciones (Assertions). ° c Amparo López Gaona, 2003 Transparencia No. 18 Restricciones de Integridad Restricciones basadas en tuplas Se especifican en la lista de restricciones. Sintaxis: CHECK (condición) pero la condición se puede referir a cualquier atributo de la relación. Se verifican cada vez que se pretende insertar/modificar una tupla de R. Si da falso se rechaza la operación. Ejemplo: Sólo el departamento de artı́culos de lujo puede tener artı́culos de más de $x.00 CREATE TABLE ventas ( departamento CHAR(30), articulo VARCHAR(200), precio REAL, CHECK (departamento = ’lujoso’ OR precio <= xxxx.00) ); ° c Amparo López Gaona, 2003 Transparencia No. 19 Restricciones de Integridad Afirmaciones Son condiciones que se desea se cumplan en toda la base de datos, no sólo en una relación. CREATE ASSERTION nombre CHECK condición; Se verifican cuando alguna de las relaciones mencionadas cambia. Al crear una afirmación, el sistema comprueba su validez. La comprobación puede introducir una sobrecarga importante. NO puede haber más sucursales que clientes. CREATE ASSERTION pocos CHECK ( (SELECT COUNT (*) FROM sucursal) <= (SELECT COUNT (*) FROM cliente) ); Se verifica cada vez que sucursal o cliente cambien. ° c Amparo López Gaona, 2003 Transparencia No. 20 Restricciones de Integridad La suma de los importes de los préstamos de cada sucursal debe ser menor que la suma de los saldos de cuentas de esa sucursal. CREATE ASSERTION suma_restringida CHECK (NOT EXISTS (SELECT * FROM sucursal WHERE (SELECT SUM(saldo) FROM cuenta WHERE cuenta.nombre_sucursal =sucursal.nombre_sucursal) >= (SELECT SUM(importe) FROM préstamo WHERE préstamo.nombre_sucursal=sucursal.nombre_sucursal) Se puede escribir como restricción dentro de sucursal, pero sólo se validarı́a al modificar esta tabla, pero no al modificar cuenta. ° c Amparo López Gaona, 2003 Transparencia No. 21 Restricciones de Integridad Verificar que la suma de los saldos por sucursal sea mayor que 10 millones de pesos. CREATE ASSERTION sumaSaldo CHECK( 10000000 <= ALL (SELECT SUM(saldo) FROM préstamo GROUP BY nombre_sucursal); Esta involucra sólo a préstamo, ası́ que podrı́a haberse escrito como CHECK basado en tupla. La validación no se efectuarı́a al suprimir tuplas. ° c Amparo López Gaona, 2003 Transparencia No. 22 Restricciones de Integridad Comparación de restricciones Restricción CHECK basado en atributos CHECK basado en tuplas ASSERTION Declaración con el atributo elemento del esquema de la relación elemento del esquema de la base de datos ° c Amparo López Gaona, 2003 Activación inserción de tupla modificación de atributo inserción de tupla modificación de tupla Al cambiar cualquier relación mencionada ¿Garantizada? no, si hay subconsultas no, si hay subconsultas Sı́ Transparencia No. 23 Restricciones de Integridad Modificación de restricciones 1. Asignar nombre a las restricciones. Se debe preceder la restricción por CONSTRAINT nombre de la restricción. nombre_suc CHAR(30) CONSTRAINT nombreClave PRIMARY KEY, saldo CHAR(1) CONSTRAINT saldoPositivo CHECK (saldo >= 0), CREATE DOMAIN dominioCP INT CONSTRAINT seisDigitos CHECK (VALUE >= 1000000); CONSTRAINT xxxx CHECK (sexo ’f’ OR name like ’Marı́a %’) ° c Amparo López Gaona, 2003 Transparencia No. 24 Restricciones de Integridad 2. Alterar restricciones ALTER TABLE Para agregar o eliminar columnas. ALTER DOMAIN Pasa cambiar el valor por omisión de un dominio. ALTER TABLE Para cambiar restricciones basadas en atributos y en tuplas. Ejemplos: ALTER TABLE sucursal DROP CONSTRAINT nombreClave; ALTER TABLE cuenta DROP CONSTRAINT saldoPositivo; ALTER TABLE persona DROP CONSTRAINT dominioCP; ALTER TABLE persona DROP CONSTRAINT xxxx; ALTER TABLE sucursal ADD CONSTRAINT nombreClave PRIMARY KEY (nombre); ° c Amparo López Gaona, 2003 Transparencia No. 25 Restricciones de Integridad 3. Alterar restricciones de dominio ALTER DOMAIN dominioX DROP CONSTRAINT restriccionX; ALTER DOMAIN dominioX ADD CONSTRAINT restriccionX CHECK (VALUE ...) ; 4. Alterar afirmaciones DROP ASSERTION nombre; ° c Amparo López Gaona, 2003 Transparencia No. 26 Restricciones de Integridad Disparadores Un disparador (trigger) es una secuencia de acciones que el sistema ejecuta de manera automática como efecto secundario de una modificación a la BD. No son sólo utilizados para prevenir violaciones a las restricciones Para diseñar un disparador se debe: Especificar las condiciones en las que se va a ejecutar el disparador. Especificar las acciones que se van a realizar cuando se active el disparador. ° c Amparo López Gaona, 2003 Transparencia No. 27 Restricciones de Integridad Ejemplo. En lugar de tener saldos negativos, se hace un préstamo por el importe de dicho saldo. DEFINE TRIGGER descubierto ON UPDATE OF cuenta T (IF NEW T.saldo < 0 then ( INSERT INTO prestamo VALUES (T.nombre_sucursal, T.núm_cuenta, - new T.saldo) INSERT INTO prestatario (SELECT nombre_cliente, núm_cuenta FROM cta_cliente WHERE T.núm_cuenta = cta_cliente.núm_cuenta) UPDATE cuenta S SET S.saldo = 0 WHERE S.núm_cuenta = T.núm_cuenta)) ° c Amparo López Gaona, 2003 Transparencia No. 28