tercera forma normal (3nf) -...
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