Restricciones de Integridad

Anuncio
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
Descargar