English version (when available)
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);
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);
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.
update TA set a=15 where a = 1;
delete from TC where e=2000;
delete from TA where a=3;
delete from TB where c=100;
delete from TC where e=3000;
delete from TB where c=400;
delete from TA where a=15;
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);
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);
delete from TA where a = 2; update TA set a=15 where a = 1; update TB set c=150 where c = 100;
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);
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.
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.
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.
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.