tercera forma normal (3nf) -...

50
Prof. Jaime Navón BD2006 51 Tercera Forma Normal (3NF) Un esquema de relación R está en 3NF si está en 2NF y no hay dependencias transitivas de la clave por parte de atributos (no primos) X -> Y es una dependencia transitiva de X si existe un subconjunto de atributos Z tales que X -> Z y Z ->Y Ejemplo: NOMBREE RUT FECHAN DIRECCION NUMEROD NOMBRED RUTGTE RUT -> NOMBREE, FECHAN, DIRECCION, NUMEROD NUMEROD -> NOMBRED, RUTGTE No existen atributos que dependen parcialmente de la clave => 2NF pero existen dependencias transitivas de la clave (cuales) => no es 3NF Puede llevarse a 3NF de la siguiente forma: NOMBREE RUT FECHAN DIRECCION NUMERO NUMEROD NOMBRED RUTGTE

Upload: buique

Post on 15-Oct-2018

214 views

Category:

Documents


0 download

TRANSCRIPT

Prof. Jaime Navón BD2006 51

Tercera Forma Normal (3NF)

• Un esquema de relación R está en 3NF si está en 2NF y no hay dependenciastransitivas de la clave por parte de atributos (no primos)

• X -> Y es una dependencia transitiva de X si existe un subconjunto de atributos Ztales que X -> Z y Z ->Y

• Ejemplo:

• NOMBREE RUT FECHAN DIRECCION NUMEROD NOMBRED RUTGTE

• RUT -> NOMBREE, FECHAN, DIRECCION, NUMEROD

• NUMEROD -> NOMBRED, RUTGTE

• No existen atributos que dependen parcialmente de la clave => 2NF pero existendependencias transitivas de la clave (cuales) => no es 3NF

• Puede llevarse a 3NF de la siguiente forma:

• NOMBREE RUT FECHAN DIRECCION NUMERO

• NUMEROD NOMBRED RUTGTE

Prof. Jaime Navón BD2006 52

Claves, claves ...

• 3NF - Todo atributo (no clave) depende de la clave, toda la clave, y nadamás que la clave

Un esquema de relación R está en 3FN si para todo X->A se cumple:

a) X es una superclave de R o bien

b) A es un atributo primo de R

Prof. Jaime Navón BD2006 53

Forma Normal de Boyce-Codd

• Un esquema de relación R está en BCNF si para todo X->A en R, X es unasuperclave de R

• BCNF es un poco más estricta que 3NF

• se quita la posibilidad de tener una dependencia de algo que no es superclave en el caso que setrate de un atributo primo

• se considera mejor que 3NF pero ambos son aceptables, en cambio 1NF y 2NF salvo situaciones muypuntuales no se consideran buenos diseño

• Ejemplo:

LOTES(ID_PROPIEDAD, NOMBRE_MUNIC, NUM_LOTE, AREA)

ID_PROPIEDAD -> {NOMBRE_MUNIC, NUM_LOTE, AREA}

{NOMBRE_MUNIC, NUM_LOTE}->{AREA, ID_PROPIEDAD}

AREA -> NOMBRE_MUNIC

• Esquema es 3NF porque NOMBRE_MUNIC es un atributo primo.

• Última dependencia viola BCNF porque AREA no es superclave

Prof. Jaime Navón BD2006 54

Obtención de 3NF

• Dadas las Dependencias Funcionales del diagrama siguiente:

• Observar las fuentes de las dependencias: DEPTO, EMP, PROJ, OFFICE, PHONE,EMP_DATE

• Incorporamos sus claves y sus dependencias directas:

• DEPTO(Dept#, Dbudget, Mgr#)

• EMP(Emp#, Proj#, Phone#)

• PROJ(Proj#, Dept#, Pbudget)

• OFFICE(Off#, Dept#, Area)

• PHONE(Phone#, Off#)

• EMP_DATE(Emp#, Date, JobTitle, Salary)

Prof. Jaime Navón BD2006 55

Num Curso Deporte

100 Música Natación

100 Contabilidad Natación

100 Música Tenis

100 Contabilidad Tenis

150 Matemáticas Atletismo

Cuarta Forma Normal (4NF)

• La 4NF tiene que ver con dependencias multivaluadas ...

• el valor de un atributo determina un conjunto de valores para unsegundo atributo.

• Ej: Estudiante(Num, Curso, Deporte)

• Num no determina ni Especialidad ni Deporte

• Num multidetermina Especialidad (->>)

• Num multidetermina Deporte

• Esquema es BCNF pero hay algunas anomalías ...

Num Curso Deporte

100 Música Natación

100 Contabilidad Natación

100 Música Tenis

100 Contabilidad Tenis

150 Matemáticas Atletismo

Prof. Jaime Navón BD2006 56

Anomalías

• estudiante con n cursos y m deportes requiere n x m tuplas

• si estudiante 100 toma un nuevo curso hay que agregar 2 tuplas

Num Curso Deporte

100 Música Natación

100 Contabilidad Natación

100 Música Tenis

100 Contabilidad Tenis

150 Matemáticas Atletismo

Num Curso Deporte

100 Música Natación

100 Contabilidad Natación

100 Música Tenis

100 Contabilidad Tenis

150 Matemáticas Atletismo

Prof. Jaime Navón BD2006 57

Formalización

• En un esquema R con al menos 3 atributos existe una dependencia de valores múltiplescuando uno de ellos multidetermina a cada uno de los otros dos

• R(A,B,C), A ->->B, A->->C (B y C son independientes)

• Un esquema está en 4NF si está en BCNF y además no hay dependencias de valoresmúltiples

• Solución para el ejemplo sería dividir el esquema original en:

Cursos(Num, Curso)Deportes(Num, Deporte)

Prof. Jaime Navón BD2006 58

Vuelta a Dependencias Funcionales

• Problema: Dado un set de atributos como saber si representa una clave

• Sabemos que todos los atributos dependen funcionalmente de la clave,entonces ...

• Bastaría ver si se cumple que todos los atributos dependen funcionalmentedel set de atributos dado, pero ...

• Generalmente no se tienen todas las dependencias en forma explícita

Prof. Jaime Navón BD2006 59

Ejemplo

• Se tiene una relación R(A, B, C, D, E) con las siguientes dependenciasfuncionales:

• AB -> C; CD -> E; C -> A; y E -> D

¿ Es BCD una clave ?

• BCD -> B (1), BCD ->C (2), BCD -> D (3), BCD -> CD (4)

• Combinando (4) con CD->E se obtiene BCD ->E (5)

• Combinando (2) con C->A se obtiene BCD -> A (5)

• Luego, BCD es al menos una superclave ...

• Habría que mostrar ahora que ni BC ni CD ni BD son superclaves

Prof. Jaime Navón BD2006 60

Reglas de Inferencia

• las reglas 1,2,3 (reglas de inferencia de Armstrog) son correctas y completas (Armstrong,1974)

• empleo repetido de ellos permite calcular F+ (clausura de F) para cualquier conjunto dedependencias funcionales F dado

• se puede demostrar 4, 5 y 6 usando 1, 2 y 3

• 1,2 y 3 salen de definición de DF

Prof. Jaime Navón BD2006 61

Clausura de un Conjunto de Dependencias

• Dado un conjunto de atributos X (que aparecen en el lado izquierdo de lasdependencias funcionales F), obtener X+ ,el conjunto de atributos determinadosfuncionalmente por X (Clausura de X bajo F)

X+ = XRepeat

old X+ = X+For every Y->Z in F doif Y ⊆ X+ then X+ = X+ ∪ Z

Until (old X+ == X+)

Prof. Jaime Navón BD2006 62

Ejemplo de Cálculo

F = {RUT->NombreE, NumeroP->NombreP LugarP, RUT NumeroP -> Horas }{RUT}+ = RUT{RUT}+ = RUT NombreE{RUT}+ = RUT NombreE{NumeroP}+ = NumeroP{NumeroP}+ = NumeroP NombreP LugarP{NumeroP}+ = NumeroP NombreP LugarP{RUT NumeroP}+ = RUT NumeroP{RUT NumeroP}+ = RUT NumeroP NombreE{RUT NumeroP}+ = RUT NumeroP NombreE NombreP LugarP{RUT NumeroP}+ = RUT NumeroP NombreE NombreP LugarP Horas{RUT NumeroP}+ = RUT NumeroP NombreE NombreP LugarP Horas

Prof. Jaime Navón BD2006 63

Equivalencia de DFs

• Dados dos conjuntos de DF E y F, se dice que E está cubierto por F (F cubre a E)si toda DF en E está también en F+

• Dos conjuntos de DF E y F son equivalentes si E+ = F+

• E y F equivalentes sii E cubre a F y F cubre a E

• Un conjunto de DF F es mínimo si

• Toda dependencia en F tiene un sólo atributo en el lado derecho

• Si se quita cualquier dependencia de F el conjunto resultante no es equivalente a F

• No es posible reemplazar ninguna dependencia X -> A por una dependencia Y -> A con Y ⊂ X yseguir teniendo un conjunto de dependencias equivalentes a F

• Un conjunto de DF mínimo equivalente a F se denomina cobertura mínima de F(puede habr más de una)

Prof. Jaime Navón BD2006 64

Algebra Relacional

• Conjunto de operaciones que permite manejar relaciones completas

• Resultado de operar sobre una relación o sobre un par de relaciones es unarelación

• Lo anterior permite construir expresiones complejas con operadorescombinados

• Operaciones de Conjuntos

• Unión, Intersección, Diferencia, Producto Cartesiano

• Operaciones Relacionales

• Selección, Proyección, Reunión y División

Prof. Jaime Navón BD2006 65

Selección

• Permite seleccionar un subconjunto de tuplas que satisface una condición

dada del total de tuplas de la tabla

• σ<condición> (<relación>)

• Ejemplos:σDNO=4 (EMPLOYEE)σSALARY > 300.000 (EMPLOYEE)

σDNO=4 (σSALARY > 300.000(EMPLOYEE))

σSALARY > 300.000(σDNO=4(EMPLOYEE))

σSALARY > 300.000 and DNO=4 (EMPLOYEE)

Prof. Jaime Navón BD2006 66

Proyección

• Permite seleccionar sólo algunas de las columnas de la tabla original

• Normalmente la eliminación de columnas produce tuplas duplicadas por lo

cual la relación resultante puede tener también menos tupla

• π<lista de atributos>(<relación>)

Ejemplo:

πLNAME, FNAME, SALARY(EMPLOYEE)

Prof. Jaime Navón BD2006 67

Operadores de Conjuntos

• UNION

• R ∪ S contiene todas las tuplas que están en R o en S (se eliminan los duplicados)

• INTERSECCION

• R ∩ S contiene todas las tuplas que están tanto en R como en S

• DIFERENCIA

• R - S contiene las tuplas que están en R pero no en S

• PRODUCTO CARTESIANO

• R(A1, ..., An) x S(B1, ..., Bm) = Q(A1, ..., An, B1, ..., Bm)

• (una tupla por cada combinación de tuplas de R y S)

• Unión, Intersección y Diferencia son operadores binarios

• relaciones deben ser compatibles (mismo número de atributos y dominios comunes)

• Operadores de unión en intersección son conmutativos y asociativos

Prof. Jaime Navón BD2006 68

Reunión (Join)

• union de tuplas relacionadas de dos tablas R y S

• Q = R S <condición>

• Produce, igual que el producto cartesiano, una relación Q con n+m atributos

• Q tiene una tupla por cada combinación de tuplas de R y S que satisfaga lacondición

• La condición en general es una conjunción de expresiones Ai Θ Bj en que Θ є {=, <,>, <=, >=, !=}

• La condición mas común lejos es un simple operador de igualdad. En este caso sehabla de un equijoin

• Cuando la igualdad es entre dos atributos con el mismo nombre se hacedesaparecer uno de ellos de la relación resultante y se habla de un Join Natural

Prof. Jaime Navón BD2006 69

Ejemplo

R SNombre Edad Sueldo Nombre DeptoPerez 25 120.000 Perez VentasFuentes 36 230.000 Lopez FinanzasLopez 45 150.000 FuentesProducción

RSR.Nombre=S.Nombre

R.Nombre Edad Sueldo S.Nombre DeptoPerez 25 120.000 Perez VentasFuentes 36 230.000 Fuentes ProducciónLopez 45 150.000 Lopez Finanzas

RSNombre Edad Sueldo DeptoPerez 25 120.000 VentasFuentes 36 230.000 ProducciónLopez 45 150.000 Finanzas

Prof. Jaime Navón BD2006 70

Ejemplos

Las siguientes dos relaciones son usadas para representar órdenes decompra:

INCLUDES(#O, INAME, QUANTITY)

ORDERS(#O, DATE, CUSTOMER)

1. Nombre de los clientes que han ordenado clavos

πCUSTOMER (σNAME = ‘clavos’(INCLUDES ORDERS))

2. Números de todas las órdenes que contengan clavos

π#O (σ INAME = ‘clavos’(INCLUDES))

3. Clientes que han colocado órdenes en los últimos tres meses

π CUSTOMER (σ DATE > 2001.12.17(ORDERS))

Prof. Jaime Navón BD2006 71

Ejemplo: BD de bebedores

Una base de datos con tres tablas mantiene información sobrebebedores, los bares que frecuentan, y las cervezas que gustan tomar

FRECUENTA(BEBEDOR, BAR)

(Luis, Kopete)⇒ Luis frecuenta el bar Kopete

SIRVE(BAR, CERVEZA)

(Kopete, Royal)⇒ En Kopete se ofrece la cerveza Royal

GUSTA(BEBEDOR, CERVEZA)

(Luis, Royal)⇒ A Luis le gusta la Royal

Prof. Jaime Navón BD2006 72

ConsultasQuienes frecuentan el Bar X

πBEBEDOR (σ BAR = ‘X’(FRECUENTA))

En que bares se sirve la cerveza Y

πBAR (σCERVEZA = ‘Y’(SIRVE))

Cervezas a las cuales bebedor Z tiene acceso

πCERVEZA (σ BEBEDOR = ‘Z’(FRECUENTA SIRVE))

Cuáles bares ofrecen alguna cerveza que le guste a Z

πBAR (σBEBEDOR = ‘Z’(SIRVE GUSTA))

Qué bebedores frecuentan a lo menos un bar donde se sirve algunacerveza que les agradeπBEBEDOR (GUSTA SIRVE FRECUENTA)

FRECUENTA(BEBEDOR, BAR)SIRVE(BAR, CERVEZA)GUSTA(BEBEDOR, CERVEZA)

Prof. Jaime Navón BD2006 73

Structured Query Language

• SQL, originalmente SEQUEL (Structured English Query Language)desarrollado e implementado por IBM Research como interfaz delDBMS System R

• Esfuerzo de estandarización (ANSI, ISO) produjo el primer standard en1986 que se conoce como SQL1

• Versión revisada aparece en 1992 que se conoce como SQL2 o SQL-92

• SQL:1999 Introduce conformancia a nivel Core (mínimo para poder decirque producto adhiere)

• SQL:2003 muy reciente (core coincide con anterior) introduce aspectosde XML

Prof. Jaime Navón BD2006 74

Más que Consultas

• Definición de Datos

• Create (Schema, Table, Domain)

• Alter (Table)

• Drop (Schema, Table)

• Consultas

• Select … From … Where …

• Actualización

• Insert

• Delete

• Update

Prof. Jaime Navón BD2006 75

Ejemplo BD

• customer(customer_id, title, fname, lname, addressline, town, zipcode, phone)

• orderinfo(orderinfo_id, customer_id, date_placed, date_shipped, shipping)

• orderline(orderinfo_id, item_id, quantity)

• item(item_id, descripction, cost_price, sell_price)

• stock(item_id, quantity)

• barcode(barcode_ean, item_id)

Prof. Jaime Navón BD2006 76

Consultas Sencillas

• Clientes de la ciudad de Bingham

select fname, lnamefrom customerwhere town = 'Bingham';

• Clientes de la ciudad de Bingham de apellido Stones

select fname, lnamefrom customerwhere town = 'Bingham' and lname = 'Stones';

Prof. Jaime Navón BD2006 77

Consultas con más de una tabla

• Nombres, Apellidos y Ciudad de todos los clientes que han comprado algo

select fname, lname, townfrom customer, orderinfowhere customer.customer_id = orderinfo.customer_id;

• Números y fecha de compra de las ordenes que incluyen 'Wood Puzzle'

select orderinfo.orderinfo_id, date_placedfrom orderinfo, item, orderlinewhere orderinfo.orderinfo_id = orderline.orderinfo_idand orderline.item_id = item.item_idand description = 'Wood Puzzle';

Prof. Jaime Navón BD2006 78

Uso de Alias

• Ordenes y fechas de aquellas que se realizaron después del 01/07/2004

select o.orderinfo_id, o.date_placedfrom orderinfo as owhere o.date_placed > '2004-07-01';

• Números y fecha de compra de las ordenes que incluyen 'Wood Puzzle'

select o.orderinfo_id, o.date_placedfrom orderinfo as o, item as i, orderline as lwhere o.orderinfo_id = l.orderinfo_id and l.item_id = i.item_id and description = 'Wood Puzzle';

Prof. Jaime Navón BD2006 79

Cambio de Encabezados en Output

select fname as nombre, lname as apellidofrom customerwhere lname = 'Stones';

nombre | apellido---------+---------- Jenny | Stones Andrew | Stones Richard | Stones Ann | Stones(4 rows)

select lname || ', ' || fname as nombre_clientefrom customerwhere lname = 'Stones';

nombre_cliente----------------- Stones, Jenny Stones, Andrew Stones, Richard Stones, Ann(4 rows)

Prof. Jaime Navón BD2006 80

Pattern Matching

• Nombre y Apellido de los clientes que viven en una ciudad que termina en e

select fname, lname, townfrom customerwhere town like '%e';

• Nombre y Apellido de los clientes que viven en una ciudad cuya segundaletras es i y termina en n

select fname, lname, townfrom customerwhere town like '_i%n';

Prof. Jaime Navón BD2006 81

Operadores de Agregación

• Cuantos productos tienen stock bajo el crítico (5)

select count(item_id)from stockwhere quantity < 5;

• Cual es mayor stock mantenido para algún producto

select max(quantity)from stock;

• Cual es el stock promedio mantenido para algún producto

select avg(quantity)from stock;

• Cuantas items en total considerando todas las ordenes se han vendido

select sum(quantity)from orderline;

Prof. Jaime Navón BD2006 82

Uso de Distinct

• SQL no elimina en forma automática duplicados

• Distinct permite hacerlo en forma explícita

• Puede ser importante con operadores de agregación

select item_idfrom orderline;

select distinct item_idfrom orderline;

item_id --------- 4 7 9 1 10 7 4 2 1 5 1 3(12 rows)

item_id --------- 1 2 3 4 5 7 9 10(8 rows)

Prof. Jaime Navón BD2006 83

Group By

• Es común querer aplicar operadores de agregación pero considerando grupos detuplas

• la cantidad total de items vendidos de cada artículo

• el promedio de items en cada orden

select item_id, quantity select item_id, sum(quantity)from orderline; from orderline

group by item_id item_id | quantity ---------+---------- item_id sum 4 | 1 ----------------- 7 | 1 10 1 9 | 1 9 1 1 | 1 7 3 10 | 1 5 2 7 | 2 4 3 4 | 2 3 1 2 | 1 2 1 1 | 1 1 3 5 | 2 1 | 1 3 | 1

(12 rows)

Prof. Jaime Navón BD2006 84

Having

• A veces queremos incluir solo algunos de los grupos involucrados en ungroup by

• total de unidades vendidas de cada item pero solo si esta cifra es mayor que 1

select item_id, sum(quantity)from orderlinegroup by item_idhaving sum(quantity) > 1;

item_id | sum---------+----- 7 | 3 5 | 2 4 | 3 1 | 3(4 rows)

Prof. Jaime Navón BD2006 85

Order By

• Permite ordernar las tuplas en el output

• por defecto es ascendente (ASC) pero se puede especificar descendente (DESC)

select item_id, sum(quantity)from orderlinegroup by item_idhaving sum(quantity) > 1order by sum(quantity); item_id | sum---------+----- 5 | 2 7 | 3 4 | 3 1 | 3(4 rows)

select item_id, sum(quantity)from orderlinegroup by item_idhaving sum(quantity) > 1order by sum(quantity) desc; item_id | sum---------+----- 7 | 3 4 | 3 1 | 3 5 | 2(4 rows)

Prof. Jaime Navón BD2006 86

Todo Junto

• Cantidad de unidades vendidas de cada item sin considerar aquellos concódigo 1 y siempre que la cantidad sea mayor que 1 ordenado de mayor amenor

select item_id, sum(quantity)from orderlinewhere item_id <> 1group by item_idhaving sum(quantity) > 1order by sum(quantity) desc; item_id | sum---------+----- 7 | 3 4 | 3 5 | 2(3 rows)

Prof. Jaime Navón BD2006 87

Select Anidados (1)

• Encontrar los productos que tienen un precio de costo mayor que el promedio

test=# select * from item; item_id | description | cost_price | sell_price---------+---------------+------------+------------ 1 | Wood Puzzle | 15.23 | 21.95 2 | Rubik Cube | 7.45 | 11.49 3 | Linux CD | 1.99 | 2.49 4 | Tissues | 2.11 | 3.99 5 | Picture Frame | 7.54 | 9.95 6 | Fan Small | 9.23 | 15.75 7 | Fan Large | 13.36 | 19.95 8 | Toothbrush | 0.75 | 1.45 9 | Roman Coin | 2.34 | 2.45 10 | Carrier Bag | 0.01 | 0.00 11 | Speakers | 19.73 | 25.32(11 rows)

test=# select * from itemtest-# where cost_price > (select avg(cost_price) from item);

item_id | description | cost_price | sell_price---------+---------------+------------+------------ 1 | Wood Puzzle | 15.23 | 21.95 2 | Rubik Cube | 7.45 | 11.49 5 | Picture Frame | 7.54 | 9.95 6 | Fan Small | 9.23 | 15.75 7 | Fan Large | 13.36 | 19.95 11 | Speakers | 19.73 | 25.32(6 rows)

Prof. Jaime Navón BD2006 88

Select Anidados (2)

• el select interno puede devolver un grupo de tuplas

• encontrar los productos en stock con precio de costo mayor que 10

SELECT * FROM stock WHERE item_id IN(SELECT item_id FROM item WHERE cost_price > 10);

item_id | quantity--------+----------1 | 127 | 8

Prof. Jaime Navón BD2006 89

Select Anidados (3)

• Consultas correlacionadas - no esposible evaluar primero el select interno yluego el externo

• fechas en que se colocaron ordenes para clientes de Bingham

SELECT oi.date_placed FROM orderinfo oiWHERE oi.customer_id =

(SELECT c.customer_id from customer c WHERE c.customer_id = oi.customer_id and town = 'Bingham');

date_placed------------- 2004-06-23 2004-07-21(2 rows)

Prof. Jaime Navón BD2006 90

Cómo funciona

SELECT columnA from table1 T1WHERE T1.columnB =

(SELECT T2.columnB FROM table2 T2 WHERE T2.columnC = T1.columnC)

Prof. Jaime Navón BD2006 91

EXISTS

• clientes que han colocado ordenes

SELECT 1 FROM customer WHERE town = 'Bingham';

?column?----------111(3 rows)

SELECT fname, lname FROM customer cWHERE EXISTS (SELECT 1 FROM orderinfo oi WHERE oi.customer_id = c.customer_id);

fname | lname------+---------Alex | MatthewAnn | StonesLaura | HardyDavid | Hudson(4 rows)

Prof. Jaime Navón BD2006 92

Creación de las Tablas

CREATE TABLE nombre_tabla (nombre_col tipo_col [restricción_col],nombre_col tipo_col [restricción_col], …CONSTRAINT restricción_tabla,CONSTRAINT restricción_tabla,…)

Restricciones de Columnas• NOT NULL• UNIQUE• PRIMARY KEY• DEFAULT valor• CHECK condición• REFERENCES

Prof. Jaime Navón BD2006 93

Ejemplo

create table testcolcons (colnotnull int not null,colunique int unique,colprikey int primary key,coldefault int default 42,colcheck int check(colcheck < 42)

);

Column | Type | Modifiers------------+---------+------------ colnotnull | integer | not null colunique | integer | colprikey | integer | not null coldefault | integer | default 42 colcheck | integer |Indexes: "testcolcons_pkey" PRIMARY KEY, btree (colprikey) "testcolcons_colunique_key" UNIQUE, btree (colunique)Check constraints: "testcolcons_colcheck_check" CHECK (colcheck < 42)

Prof. Jaime Navón BD2006 94

Restricciones de Tabla

• Las restricciones que aplican a nivel de tabla son

• UNIQUE (lista_de_cols)

• PRIMARY KEY(lista_de_cols)

• CHECK(condición)

• REFERENCES

• Ejemplo de restricciones a nivel de tabla

create table ttconst (mykey1 int,mykey2 int,mystring varchar(15),constraint cs1 check (mystring <> ''),constraint cs2 primary key(mykey1, mykey2));

Prof. Jaime Navón BD2006 95

Claves Foráneas

• Restricción REFERENCES (en realidad restringe el dominio destino)

• Aunque puede incluirse como restricción a nivel de columna es recomendable incluirlasa nivel de tabla después de la resticción de clave primaria

CREATE TABLE orderinfo(orderinfo_id serial ,customer_id integer NOT NULL REFERENCES customer(customer_id),date_placed date NOT NULL,date_shipped date ,shipping numeric(7,2) ,CONSTRAINT orderinfo_pk PRIMARY KEY(orderinfo_id));

CREATE TABLE orderinfo(orderinfo_id serial ,customer_id integer NOT NULL,date_placed date NOT NULL,date_shipped date ,shipping numeric(7,2) ,CONSTRAINT orderinfo_pk PRIMARY KEY(orderinfo_id),CONSTRAINT orderinfo_customer_id_fk FOREIGN KEY(customer_id) REFERENCEScustomer(customer_id));

Prof. Jaime Navón BD2006 96

Mantenimiento de Integridad Referencial

• la restricción de clave foránea exige que cada valor decustomer_id en orderinfo esté presente en alguna tupla decustomers

• ¿Que hacer si se intenta eliminar un cliente de customers para elcual hay tuplas en orderinfo?

• impedirlo (error) - este es el defaultCONSTRAINT orderinfo_customer_id_fk FOREIGN KEY(customer_id) REFERENCEScustomer(customer_id)

• poner nulls en la info de cliente en las ordenesCONSTRAINT orderinfo_customer_id_fk FOREIGN KEY(customer_id) REFERENCEScustomer(customer_id) ON DELETE SET NULL

• eliminar automáticamente las tuplas que hacen referencia a élCONSTRAINT orderinfo_customer_id_fk FOREIGN KEY(customer_id) REFERENCEScustomer(customer_id) ON DELETE CASCADE

• Lo mismo puede especificarse para operaciones de UPDATE oambasCONSTRAINT orderinfo_customer_id_fk FOREIGN KEY(customer_id) REFERENCEScustomer(customer_id) ON DELETE CASCADE ON UPDATE SET NULL

Prof. Jaime Navón BD2006 97

Modificaciones al Esquema

• Se hacen mediante ALTER

ALTER TABLE table-name ADD COLUMN column-name column-type

ALTER TABLE table-name DROP COLUMN column-name

ALTER TABLE table-name RENAME COLUMN old-column-name TO new-column-name

ALTER TABLE table-name column-name TYPE new-type [ USING expression ]

ALTER TABLE table-name ALTER COLUMN [SET DEFAULT value | DROP DEFAULT]

ALTER TABLE table-name ALTER COLUMN [SET NOT NULL | DROP NOT NULL]

ALTER TABLE table-name ADD CHECK check-expression

ALTER TABLE table-name ADD CONSTRAINT name constraint-definition

ALTER TABLE old-table-name RENAME TO new-table-name

Prof. Jaime Navón BD2006 98

Ejemplos

test=> \d ttconstTable "public.ttconst"Column | Type | Modifiers---------+-----------------------+------mykey1 | integer | not nullmykey2 | integer | not nullmystring | character varying(15) |Indexes:"cs2" PRIMARY KEY, btree (mykey1, mykey2)Check constraints:"cs1" CHECK (mystring::text <> ''::text)

test=> ALTER TABLE ttconst ADD COLUMN mydate DATE;

test=> ALTER TABLE ttconst RENAME COLUMN mydate TO birthdate;

test=> \d ttconstTable "public.ttconst"Column | Type | Modifiers-----------+-----------------------+--mykey1 | integer | not nullmykey2 | integer | not nullmystring | character varying(15) |birthdate | date |Indexes:"cs2" PRIMARY KEY, btree (mykey1, mykey2)Check constraints:"cs1" CHECK (mystring::text <> ''::text)

test=> ALTER TABLE ttconst DROP CONSTRAINT cs1;test=> ALTER TABLE ttconst ADD CONSTRAINT cs3 UNIQUE(birthdate);test=> ALTER TABLE ttconst ALTER COLUMN mystring SET DEFAULT 'Hello';ALTER TABLE

Prof. Jaime Navón BD2006 99

Creación Implícita de una Tabla

• Es posible enviar el resultado de una consulta a una tabla que tiene lamisma estructura del resultado mediante SELECT INTO

SELECT select_targets INTO [ TABLE ] new_table FROM old_table;

test=# select * into cust2test-# from customertest-# where town ='Bingham';SELECT

test=# select * from cust2; customer_id | title | fname | lname | addressline | town | zipcode | phone-------------+-------+---------+--------+--------------+---------+------------+--------- 7 | Mr | Richard | Stones | 34 Holly Way | Bingham | BG4 2WE | 342 5982 8 | Mrs | Ann | Stones | 34 Holly Way | Bingham | BG4 2WE | 342 5982 11 | Mr | Dave | Jones | 54 Vale Rise | Bingham | BG3 8GD | 342 8264(3 rows)

Prof. Jaime Navón BD2006 100

Carga y Ejecución desde un Archivo

create table alfa (x1 varchar(10) primary key,x2 varchar(20));

insert into alfa values ('aa', 'hola');insert into alfa values ('bb', 'hola');insert into alfa values ('cc', 'hola');insert into alfa values ('dd', 'hola');insert into alfa values ('ee', 'hola');insert into alfa values ('ff', 'hola');insert into alfa values ('gg', 'hola');insert into alfa values ('hh', 'hola');insert into alfa values ('ii', 'hola');

select * from alfa;

test=# \i ej1.sqlpsql:ej1.sql:3: NOTICE: CREATE TABLE / PRIMARY

KEY will create implicit index "alfa_pkey"for table "alfa"

CREATE TABLEINSERT 25482 1INSERT 25483 1INSERT 25484 1INSERT 25485 1INSERT 25486 1INSERT 25487 1INSERT 25488 1INSERT 25489 1INSERT 25490 1 x1 | x2----+------ aa | hola bb | hola cc | hola dd | hola ee | hola ff | hola gg | hola hh | hola ii | hola(9 rows)

ej1.sql