Soluciones

English version (when available)

T07.001- Crea las siguientes tablas:

TA (a int, b int) CP(a)

TB (c int, d int) CP(c) CAj(d) >> TA (borrados: propagar, modificaciones: propagar)

TC (e int, f int) CP(e) CAj(f) >> TB (borrados: propagar, modificaciones: propagar)

create table TA(a int, b int, primary key(a));

create table TB(c int, d int, primary key(c), 
  foreign key (d) references TA(a) on delete cascade on update cascade);

create table TC(e int, f int, primary key(e), 
  foreign key (f) references TB(c) on delete cascade on update cascade);


T07.002- Inserta los siguientes datos
TA(1,10)
TA(2,20)
TA(3,30)
TB(100,1)
TB(200,1)
TB(300,2)
TB(400,NULL)
TC(1000,100)
TC(2000,100)
TC(3000,NULL)

insert into TA values (1,10);
insert into TA values (2,20);
insert into TA values (3,30);
insert into TB values (100,1);
insert into TB values (200,1);
insert into TB values (300,2);
insert into TB values (400,NULL);
insert into TC values (1000,100);
insert into TC values (2000,100);
insert into TC values (3000,NULL);


T07.003- Borra TA(2,20) y comprueba los cambios que se han producido en las 3 tablas

delete from TA where a = 2;
Para comprobar los cambios, ejecuta todas estas órdenes en una sola orden (por ejemplo, seleccionando todas las líneas y pulsando CTRL-F9)
SELECT * FROM TA;
SELECT * FROM TB;
SELECT * FROM TC;

delete from TA where a=2;

SELECT * FROM TA;
SELECT * FROM TB;
SELECT * FROM TC;

Así puedes comprobar los estados iniciales y finales de cada tabla.


T07.004- Modifica TA(1,10) a TA(15,10) y comprueba los cambios que se han producido en las 3 tablas.

update TA set a=15 where a = 1;


T07.005- Borra TC(2000,100) y comprueba los cambios que se han producido en las 3 tablas.

delete from TC where e=2000;


T07.006- Borra TA(3,30) y comprueba los cambios que se han producido en las 3 tablas.

delete from TA where a=3;


T07.007- Borra TB(100,15) y comprueba los cambios que se han producido en las 3 tablas.

delete from TB where c=100;


T07.008- Borra TC(3000,NULL) y comprueba los cambios que se han producido en las 3 tablas.

delete from TC where e=3000;


T07.009- Borra TB(400,NULL) y comprueba los cambios que se han producido en las 3 tablas.

delete from TB where c=400;


T07.010- Borra TA(15,10) y comprueba los cambios que se han producido en las 3 tablas: ¿ESTÁN LAS 3 TABLAS VACÍAS?

delete from TA where a=15;


T07.011- Vuelve a crear las tablas:

TA (a int, b int) CP(a)
TB (c int, d int) CP(c) CAj(d) >> TA
(borrados: anular, modificaciones: anular)
TC (e int, f int) CP(e) CAj(f) >> TB
(borrados: anular, modificaciones: anular)

drop table TC;
drop table TB;
drop table TA;

create table TA(a int, b int, primary key(a));

create table TB(c int, d int, primary key(c), 
  foreign key (d) references TA(a) 
    on delete set null on update set null);

create table TC(e int, f int, primary key(e), 
  foreign key (f) references TB(c) 
    on delete set null on update set null);


T07.012- Vuelve a rellenar las tablas:
TA(1,10)
TA(2,20)
TA(3,30)
TB(100,1)
TB(200,1)
TB(300,2)
TB(400,NULL)
TC(1000,100)
TC(2000,100)
TC(3000,NULL)

insert into TA values (1,10);
insert into TA values (2,20);
insert into TA values (3,30);
insert into TB values (100,1);
insert into TB values (200,1);
insert into TB values (300,2);
insert into TB values (400,NULL);
insert into TC values (1000,100);
insert into TC values (2000,100);
insert into TC values (3000,NULL);


T07.013- Ejecuta las siguientes órdenes:

Borra TA(2,20)
Modifica TA(1,10) a TA(15,10)
Modifica TB(100,NULL) a TB(150,NULL)

¿Queda algún valor de clave ajena distinto de NULL?

delete from TA where a = 2;
update TA set a=15 where a = 1;
update TB set c=150 where c = 100;


T07.014- Vuelve a crear las tablas:

TA (a int, b int) CP(a)
TB (c int, d int) CP(c) CAj(d) >> TA (borrados: propagar)
TC (e int, f int) CP(e) CAj(f) >> TB (modificaciones: anular)

TA(1,10)
TA(2,20)
TA(3,30)
TB(100,1)
TB(200,1)
TB(300,2)
TB(400,NULL)
TC(1000,100)
TC(2000,100)
TC(3000,NULL)

drop table TC;
drop table TB;
drop table TA;

create table TA(a int, b int, primary key(a));

create table TB(c int, d int, primary key(c), 
  foreign key (d) references TA(a) 
    on delete cascade);

create table TC(e int, f int, primary key(e), 
  foreign key (f) references TB(c) 
    on update set null);
insert into TA values (1,10);
insert into TA values (2,20);
insert into TA values (3,30);
insert into TB values (100,1);
insert into TB values (200,1);
insert into TB values (300,2);
insert into TB values (400,NULL);
insert into TC values (1000,100);
insert into TC values (2000,100);
insert into TC values (3000,NULL);


T07.015- Borra TA(1,10): ¿qué ha pasado?

delete from TA where a=1;
Error de ejecución. Al eliminar una fila de TA(1,10), se propaga a las filas TB(100,1) y TB(200,1). Pero, concretamente eliminar TB(100,1), afecta a las filas TC(1000,100) y TC(2000,100). El problema es que la tabla TC rechaza por defecto el delete si afecta a la integridad referencial (no se ha definido "on delete").
La operación "delete from TA where a=1" se ha rechazado.


T07.016- Borra TA(2,20): ¿qué ha pasado?

delete from TA where a=2;
Se ha ejecutado, la eliminación de la fila TA(2,20) no genera problemas de integridad referencial en las otras tablas.

T07.017- Modifica TB(100,1) a TB(170,1): ¿qué ha pasado?

update TB set c=170 where c=100;
Los cambios en filas de TB pueden afectar a otras filas de TC. La definición "on update" en la clave ajena de TC a TB es "anular".
Se ha modificado el valor de la fila en TB, y se han puesto nulos en todas las filas de TC que tenían el valor 100 en la columna f.


T07.018- Vuelve a intentar borrar TA(1,10): ¿por qué ahora sí?

delete from TA where a=1;
En los ejercicios anteriores hemos eliminado los valores de la clave ajena TC.f que nos impedían el borrado.
Se ha eliminado la fila de la tabla TA, y se ha propagado la eliminación a las filas TB(170,1) y TB(200,1). Ninguna de estas filas tenía otras en TC que dependieran de ellas.