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:
Prof. Jaime Navón
•
NOMBREE RUT FECHAN DIRECCION NUMERO
•
NUMEROD NOMBRED RUTGTE
BD2006
51
Claves, claves ...
•
3NF - Todo atributo (no clave) depende de la clave, toda la clave, y nada
má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
52
Forma Normal de Boyce-Codd
•
Un esquema de relación R está en BCNF si para todo X->A en R, X es una
superclave 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 se
trate de un atributo primo
se considera mejor que 3NF pero ambos son aceptables, en cambio 1NF y 2NF salvo situaciones muy
puntuales 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
Prof. Jaime Navón
•
Esquema es 3NF porque NOMBRE_MUNIC es un atributo primo.
•
Última dependencia viola BCNF porque AREA no es superclave
BD2006
53
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:
•
•
•
•
•
•
Prof. Jaime Navón
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)
BD2006
54
Cuarta Forma Normal (4NF)
•
•
•
La 4NF tiene que ver con dependencias multivaluadas ...
el valor de un atributo determina un conjunto de valores para un
segundo atributo.
Ej: Estudiante(Num, Curso, Deporte)
Prof. Jaime Navón
•
Num no determina ni Especialidad ni Deporte
•
Num multidetermina Especialidad (->>)
•
Num multidetermina Deporte
•
Esquema es BCNF pero hay algunas anomalías ...
BD2006
Num
Num
100
100
100
100
100
100
100
100
150
150
Curso
Curso
Música
Música
Contabilidad
Contabilidad
Música
Música
Contabilidad
Contabilidad
Matemáticas
Matemáticas
Deporte
Deporte
Natación
Natación
Natación
Natación
Tenis
Tenis
Tenis
Tenis
Atletismo
Atletismo
55
Anomalías
Num
Num
100
100
100
100
100
100
100
100
150
150
•
•
Curso
Curso
Música
Música
Contabilidad
Contabilidad
Música
Música
Contabilidad
Contabilidad
Matemáticas
Matemáticas
Deporte
Deporte
Natación
Natación
Natación
Natación
Tenis
Tenis
Tenis
Tenis
Atletismo
Atletismo
estudiante con n cursos y m deportes requiere n x m tuplas
si estudiante 100 toma un nuevo curso hay que agregar 2 tuplas
Prof. Jaime Navón
BD2006
56
Formalización
•
•
•
•
En un esquema R con al menos 3 atributos existe una dependencia de valores múltiples
cuando 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 valores
múltiples
Solución para el ejemplo sería dividir el esquema original en:
Cursos(Num, Curso)
Deportes(Num, Deporte)
Prof. Jaime Navón
BD2006
57
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 funcionalmente
del set de atributos dado, pero ...
Generalmente no se tienen todas las dependencias en forma explícita
Prof. Jaime Navón
BD2006
58
Ejemplo
•
•
Se tiene una relación R(A, B, C, D, E) con las siguientes dependencias
funcionales:
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)
•
•
Prof. Jaime Navón
Luego, BCD es al menos una superclave ...
Habría que mostrar ahora que ni BC ni CD ni BD son superclaves
BD2006
59
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 de
dependencias 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
60
Clausura de un Conjunto de Dependencias
•
Dado un conjunto de atributos X (que aparecen en el lado izquierdo de las
dependencias funcionales F), obtener X+ ,el conjunto de atributos determinados
funcionalmente por X (Clausura de X bajo F)
X+ = X
Repeat
old X+ = X+
For every Y->Z in F do
if Y ⊆ X+ then X+ = X+ ∪ Z
Until (old X+ == X+)
Prof. Jaime Navón
BD2006
61
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
62
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 y
seguir 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
63
Algebra Relacional
•
•
•
•
Conjunto de operaciones que permite manejar relaciones completas
Resultado de operar sobre una relación o sobre un par de relaciones es una
relación
Lo anterior permite construir expresiones complejas con operadores
combinados
Operaciones de Conjuntos
•
•
Unión, Intersección, Diferencia, Producto Cartesiano
Operaciones Relacionales
•
Prof. Jaime Navón
Selección, Proyección, Reunión y División
BD2006
64
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
65
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
66
Operadores de Conjuntos
•
UNION
•
•
INTERSECCION
•
•
R ∩ S contiene todas las tuplas que están tanto en R como en S
DIFERENCIA
•
•
R ∪ S contiene todas las tuplas que están en R o en S (se eliminan los duplicados)
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
67
Reunión (Join)
•
union de tuplas relacionadas de dos tablas R y S
•
Q = R S
<condición>
•
•
•
•
•
Prof. Jaime Navó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 la
condició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 se
habla de un equijoin
Cuando la igualdad es entre dos atributos con el mismo nombre se hace
desaparecer uno de ellos de la relación resultante y se habla de un Join Natural
BD2006
68
Ejemplo
R
Nombre
Perez
Fuentes
Lopez
Edad
25
36
45
S
Nombre Depto
Perez Ventas
Lopez Finanzas
FuentesProducción
Sueldo
120.000
230.000
150.000
RS
R.Nombre=S.Nombre
R.Nombre
Perez
Fuentes
Lopez
RS
Nombre
Perez
Fuentes
Lopez
Prof. Jaime Navón
Edad
25
36
45
Sueldo
120.000
230.000
150.000
S.Nombre
Perez
Fuentes
Lopez
Depto
Ventas
Producción
Finanzas
Edad
25
36
45
Sueldo
120.000
230.000
150.000
Depto
Ventas
Producción
Finanzas
BD2006
69
Ejemplos
Las siguientes dos relaciones son usadas para representar órdenes de
compra:
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
70
Ejemplo: BD de bebedores
Una base de datos con tres tablas mantiene información sobre
bebedores, 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
71
Consultas
FRECUENTA(BEBEDOR, BAR)
SIRVE(BAR, CERVEZA)
GUSTA(BEBEDOR, CERVEZA)
Quienes 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 alguna
cerveza que les agrade
πBEBEDOR (GUSTA SIRVE FRECUENTA)
Prof. Jaime Navón
BD2006
72
Structured Query Language
•
•
•
•
•
SQL, originalmente SEQUEL (Structured English Query Language)
desarrollado e implementado por IBM Research como interfaz del
DBMS System R
Esfuerzo de estandarización (ANSI, ISO) produjo el primer standard en
1986 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 decir
que producto adhiere)
SQL:2003 muy reciente (core coincide con anterior) introduce aspectos
de XML
Prof. Jaime Navón
BD2006
73
Más que Consultas
•
Definición de Datos
•
•
•
•
Alter (Table)
Drop (Schema, Table)
Consultas
•
•
Create (Schema, Table, Domain)
Select … From … Where …
Actualización
•
•
•
Prof. Jaime Navón
Insert
Delete
Update
BD2006
74
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
75
Consultas Sencillas
•
Clientes de la ciudad de Bingham
select fname, lname
from customer
where town = 'Bingham';
•
Clientes de la ciudad de Bingham de apellido Stones
select fname, lname
from customer
where town = 'Bingham' and lname = 'Stones';
Prof. Jaime Navón
BD2006
76
Consultas con más de una tabla
•
Nombres, Apellidos y Ciudad de todos los clientes que han comprado algo
select fname, lname, town
from customer, orderinfo
where customer.customer_id = orderinfo.customer_id;
•
Números y fecha de compra de las ordenes que incluyen 'Wood Puzzle'
select orderinfo.orderinfo_id, date_placed
from orderinfo, item, orderline
where orderinfo.orderinfo_id = orderline.orderinfo_id
and orderline.item_id = item.item_id
and description = 'Wood Puzzle';
Prof. Jaime Navón
BD2006
77
Uso de Alias
•
Ordenes y fechas de aquellas que se realizaron después del 01/07/2004
select o.orderinfo_id, o.date_placed
from orderinfo as o
where 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_placed
from orderinfo as o, item as i, orderline as l
where o.orderinfo_id = l.orderinfo_id
and l.item_id = i.item_id
and description = 'Wood Puzzle';
Prof. Jaime Navón
BD2006
78
Cambio de Encabezados en Output
select fname as nombre, lname as apellido
from customer
where lname = 'Stones';
nombre | apellido
---------+---------Jenny
| Stones
Andrew | Stones
Richard | Stones
Ann
| Stones
(4 rows)
select lname || ', ' || fname as nombre_cliente
from customer
where lname = 'Stones';
nombre_cliente
----------------Stones, Jenny
Stones, Andrew
Stones, Richard
Stones, Ann
(4 rows)
Prof. Jaime Navón
BD2006
79
Pattern Matching
•
Nombre y Apellido de los clientes que viven en una ciudad que termina en e
select fname, lname, town
from customer
where town like '%e';
•
Nombre y Apellido de los clientes que viven en una ciudad cuya segunda
letras es i y termina en n
select fname, lname, town
from customer
where town like '_i%n';
Prof. Jaime Navón
BD2006
80
Operadores de Agregación
•
Cuantos productos tienen stock bajo el crítico (5)
select count(item_id)
from stock
where 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
81
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_id
from orderline;
select distinct item_id
from orderline;
Prof. Jaime Navón
item_id
--------1
2
3
4
5
7
9
10
(8 rows)
item_id
--------4
7
9
1
10
7
4
2
1
5
1
3
(12 rows)
BD2006
82
Group By
•
Es común querer aplicar operadores de agregación pero considerando grupos de
tuplas
•
la cantidad total de items vendidos de cada artículo
•
el promedio de items en cada orden
select item_id, quantity
from orderline;
item_id | quantity
---------+---------4 |
1
7 |
1
9 |
1
1 |
1
10 |
1
7 |
2
4 |
2
2 |
1
1 |
1
5 |
2
1 |
1
3 |
1
select item_id, sum(quantity)
from orderline
group by item_id
item_id
sum
----------------10
1
9
1
7
3
5
2
4
3
3
1
2
1
1
3
(12 rows)
Prof. Jaime Navón
BD2006
83
Having
•
A veces queremos incluir solo algunos de los grupos involucrados en un
group by
•
total de unidades vendidas de cada item pero solo si esta cifra es mayor que 1
select item_id, sum(quantity)
from orderline
group by item_id
having sum(quantity) > 1;
item_id | sum
---------+----7 |
3
5 |
2
4 |
3
1 |
3
(4 rows)
Prof. Jaime Navón
BD2006
84
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 orderline
group by item_id
having sum(quantity) > 1
order by sum(quantity);
item_id | sum
---------+----5 |
2
7 |
3
4 |
3
1 |
3
(4 rows)
select item_id, sum(quantity)
from orderline
group by item_id
having sum(quantity) > 1
order by sum(quantity) desc;
item_id | sum
---------+----7 |
3
4 |
3
1 |
3
5 |
2
(4 rows)
Prof. Jaime Navón
BD2006
85
Todo Junto
•
Cantidad de unidades vendidas de cada item sin considerar aquellos con
código 1 y siempre que la cantidad sea mayor que 1 ordenado de mayor a
menor
select item_id, sum(quantity)
from orderline
where item_id <> 1
group by item_id
having sum(quantity) > 1
order by sum(quantity) desc;
item_id | sum
---------+----7 |
3
4 |
3
5 |
2
(3 rows)
Prof. Jaime Navón
BD2006
86
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 item
test-# 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
87
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
| 12
7
| 8
Prof. Jaime Navón
BD2006
88
Select Anidados (3)
•
Consultas correlacionadas - no esposible evaluar primero el select interno y
luego el externo
•
fechas en que se colocaron ordenes para clientes de Bingham
SELECT oi.date_placed FROM orderinfo oi
WHERE 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
89
Cómo funciona
SELECT columnA from table1 T1
WHERE T1.columnB =
(SELECT T2.columnB FROM table2 T2 WHERE T2.columnC = T1.columnC)
Prof. Jaime Navón
BD2006
90
EXISTS
•
clientes que han colocado ordenes
SELECT 1 FROM customer WHERE town = 'Bingham';
?column?
---------1
1
1
(3 rows)
SELECT fname, lname FROM customer c
WHERE EXISTS (SELECT 1 FROM orderinfo oi WHERE oi.customer_id = c.customer_id);
fname | lname
------+--------Alex | Matthew
Ann
| Stones
Laura | Hardy
David | Hudson
(4 rows)
Prof. Jaime Navón
BD2006
91
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
•
•
•
•
•
•
Prof. Jaime Navón
NOT NULL
UNIQUE
PRIMARY KEY
DEFAULT valor
CHECK condición
REFERENCES
BD2006
92
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
93
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
94
Claves Foráneas
•
•
Restricción REFERENCES (en realidad restringe el dominio destino)
Aunque puede incluirse como restricción a nivel de columna es recomendable incluirlas
a 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) REFERENCES
customer(customer_id)
);
Prof. Jaime Navón
BD2006
95
Mantenimiento de Integridad Referencial
•
•
la restricción de clave foránea exige que cada valor de
customer_id en orderinfo esté presente en alguna tupla de
customers
¿Que hacer si se intenta eliminar un cliente de customers para el
cual hay tuplas en orderinfo?
•
impedirlo (error) - este es el default
CONSTRAINT orderinfo_customer_id_fk FOREIGN KEY(customer_id) REFERENCES
customer(customer_id)
•
poner nulls en la info de cliente en las ordenes
CONSTRAINT orderinfo_customer_id_fk FOREIGN KEY(customer_id) REFERENCES
customer(customer_id) ON DELETE SET NULL
•
eliminar automáticamente las tuplas que hacen referencia a él
CONSTRAINT orderinfo_customer_id_fk FOREIGN KEY(customer_id) REFERENCES
customer(customer_id) ON DELETE CASCADE
•
Lo mismo puede especificarse para operaciones de UPDATE o
ambas
CONSTRAINT orderinfo_customer_id_fk FOREIGN KEY(customer_id) REFERENCES
customer(customer_id) ON DELETE CASCADE ON UPDATE SET NULL
Prof. Jaime Navón
BD2006
96
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
97
Ejemplos
test=> \d ttconst
Table "public.ttconst"
Column
| Type | Modifiers
---------+-----------------------+-----mykey1
| integer | not null
mykey2
| integer | not null
mystring | 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;
Prof. Jaime Navón
test=> \d ttconst
Table "public.ttconst"
Column | Type | Modifiers
-----------+-----------------------+-mykey1
| integer | not null
mykey2
| integer | not null
mystring | 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
BD2006
98
Creación Implícita de una Tabla
•
Es posible enviar el resultado de una consulta a una tabla que tiene la
misma estructura del resultado mediante SELECT INTO
SELECT select_targets
INTO [ TABLE ] new_table
FROM old_table;
test=# select * into cust2
test-# from customer
test-# 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
99
Carga y Ejecución desde un Archivo
create table alfa (
x1 varchar(10) primary key,
x2 varchar(20));
insert
insert
insert
insert
insert
insert
insert
insert
insert
into
into
into
into
into
into
into
into
into
alfa
alfa
alfa
alfa
alfa
alfa
alfa
alfa
alfa
values
values
values
values
values
values
values
values
values
select * from alfa;
Prof. Jaime Navón
ej1.sql
('aa',
('bb',
('cc',
('dd',
('ee',
('ff',
('gg',
('hh',
('ii',
'hola');
'hola');
'hola');
'hola');
'hola');
'hola');
'hola');
'hola');
'hola');
test=# \i ej1.sql
psql:ej1.sql:3: NOTICE: CREATE TABLE / PRIMARY
KEY will create implicit index "alfa_pkey"
for table "alfa"
CREATE TABLE
INSERT 25482 1
INSERT 25483 1
INSERT 25484 1
INSERT 25485 1
INSERT 25486 1
INSERT 25487 1
INSERT 25488 1
INSERT 25489 1
INSERT 25490 1
x1 | x2
----+-----aa | hola
bb | hola
cc | hola
dd | hola
ee | hola
ff | hola
gg | hola
hh | hola
ii | hola
(9 rows)
BD2006
100
Puede agregar este documento a su colección de estudio (s)
Iniciar sesión Disponible sólo para usuarios autorizadosPuede agregar este documento a su lista guardada
Iniciar sesión Disponible sólo para usuarios autorizados(Para quejas, use otra forma )