62 - Restricciones foreign key (acciones) |
Una empresa tiene registrados sus clientes en una tabla llamada "clientes", también tiene una tabla "provincias" donde registra los nombres de las provincias.
1- Elimine las tablas "clientes" y "provincias":
drop table clientes; drop table provincias;
2- Créelas con las siguientes estructuras:
create table clientes ( codigo number(5), nombre varchar2(30), domicilio varchar2(30), ciudad varchar2(20), codigoprovincia number(2), primary key(codigo) ); create table provincias( codigo number(2), nombre varchar2(20), primary key (codigo) );
3- Ingrese algunos registros para ambas tablas:
insert into provincias values(1,'Cordoba'); insert into provincias values(2,'Santa Fe'); insert into provincias values(3,'Misiones'); insert into provincias values(4,'Rio Negro'); insert into clientes values(100,'Perez Juan','San Martin 123','Carlos Paz',1); insert into clientes values(101,'Moreno Marcos','Colon 234','Rosario',2); insert into clientes values(102,'Acosta Ana','Avellaneda 333','Posadas',3);
4- Establezca una restricción "foreign key" especificando la acción "set null" para eliminaciones.
5- Elimine el registro con código 3, de "provincias" y consulte "clientes" para ver qué cambios ha realizado Oracle en los registros coincidentes
Todos los registros con "codigoprovincia" 3 han sido seteados a null.
6- Consulte el diccionario "user_constraints" para ver qué acción se ha establecido para las eliminaciones
7- Intente modificar el registro con código 2, de "provincias"
8- Elimine la restricción "foreign key" establecida sobre "clientes"
9- Establezca una restricción "foreign key" sobre "codigoprovincia" de "clientes" especificando la acción "cascade" para eliminaciones
10- Consulte el diccionario "user_constraints" para ver qué acción se ha establecido para las eliminaciones sobre las restricciones "foreign key" de la tabla "clientes"
11- Elimine el registro con código 2, de "provincias"
12- Verifique que el cambio se realizó en cascada, es decir, que se eliminó en la tabla "provincias" y todos los clientes de la provincia eliminada
13- Elimine la restricción "foreign key"
14- Establezca una restricción "foreign key" sin especificar acción para eliminaciones
15- Intente eliminar un registro de la tabla "provincias" cuyo código exista en "clientes"
16- Consulte el diccionario "user_constraints" para ver qué acción se ha establecido para las eliminaciones sobre la restricción "FK_CLIENTES_CODIGOPROVINCIA"
17- Intente elimimar la tabla "provincias"
18- Elimine la restricción "foreign key"
19- Elimine la tabla "provincias"
Ver solucióndrop table clientes; drop table provincias; create table clientes ( codigo number(5), nombre varchar2(30), domicilio varchar2(30), ciudad varchar2(20), codigoprovincia number(2), primary key(codigo) ); create table provincias( codigo number(2), nombre varchar2(20), primary key (codigo) ); insert into provincias values(1,'Cordoba'); insert into provincias values(2,'Santa Fe'); insert into provincias values(3,'Misiones'); insert into provincias values(4,'Rio Negro'); insert into clientes values(100,'Perez Juan','San Martin 123','Carlos Paz',1); insert into clientes values(101,'Moreno Marcos','Colon 234','Rosario',2); insert into clientes values(102,'Acosta Ana','Avellaneda 333','Posadas',3); alter table clientes add constraint FK_clientes_codigoprovincia foreign key (codigoprovincia) references provincias(codigo) on delete set null; delete from provincias where codigo=3; select *from clientes; select constraint_name, constraint_type, delete_rule from user_constraints where table_name='CLIENTES'; update provincias set codigo=9 where codigo=2; alter table clientes drop constraint FK_CLIENTES_CODIGOPROVINCIA; alter table clientes add constraint FK_clientes_codigoprovincia foreign key (codigoprovincia) references provincias(codigo) on delete cascade; select constraint_name, delete_rule from user_constraints where table_name='CLIENTES' and constraint_type= 'R'; delete from provincias where codigo=2; select *from provincias; select *from clientes; alter table clientes drop constraint FK_CLIENTES_CODIGOPROVINCIA; alter table clientes add constraint FK_clientes_codigoprovincia foreign key (codigoprovincia) references provincias(codigo); delete from provincias where codigo=1; select constraint_type, delete_rule from user_constraints where table_name='CLIENTES' and constraint_name='FK_CLIENTES_CODIGOPROVINCIA'; drop table provincias; alter table clientes drop constraint FK_CLIENTES_CODIGOPROVINCIA; drop table provincias;
Un club dicta clases de distintos deportes. En una tabla llamada "deportes" guarda la información de los distintos deportes que se enseñan; en una tabla "socios", los datos de los socios y en una tabla "inscripciones" almacena la información necesaria para las inscripciones de los distintos socios a los distintos deportes.
1- Elimine las tablas:
drop table inscripciones; drop table deportes; drop table socios;
2- Cree las tablas:
create table deportes( codigo number(2), nombre varchar2(20), primary key(codigo) ); create table socios( documento char(8), nombre varchar2(30), primary key(documento) ); create table inscripciones( documento char(8), codigodeporte number(2), matricula char(1),-- 's' si está paga, 'n' si no está paga primary key(documento,codigodeporte) );
3- Establezca una restricción "foreign key" para "inscripciones" que haga referencia al campo "codigo" de "deportes" indicando la acción "cascade" para eliminaciones
4- Establezca una restricción "foreign key" para "inscripciones" que haga referencia al campo "documento" de "socios" que permita la eliminación "set null" (Recuerde que se pueden establecer varias restricciones "foreign key" sobre una misma tabla)
5- Ingrese algunos registros en las tablas:
insert into deportes values(1,'basquet'); insert into deportes values(2,'futbol'); insert into deportes values(3,'natacion'); insert into deportes values(4,'tenis'); insert into socios values('30000111','Juan Lopez'); insert into socios values('31111222','Ana Garcia'); insert into socios values('32222333','Mario Molina'); insert into socios values('33333444','Julieta Herrero'); insert into inscripciones values ('30000111',1,'s'); insert into inscripciones values ('30000111',2,'s'); insert into inscripciones values ('31111222',1,'s'); insert into inscripciones values ('32222333',3,'n');
6- Intente ingresar una inscripción con un código de deporte inexistente:
Mensaje de error.
7- Intente ingresar una inscripción con un documento inexistente en "socios"
8- Elimine un registro de "deportes" que no tenga inscriptos.
Se elimina porque no hay inscriptos en dicho deporte.
9- Consulte "inscripciones", "deportes" y "socios" (realizando un join)
10-Elimine un deporte para los cuales haya inscriptos
Se elimina el deporte "natacion" de "deportes" y de "inscripciones", todos los registros con el valor correspondiente a "natacion" en "codigodeporte".
11- Verifique que se han eliminado los registros de "inscripciones" cuyo código de deporte correspondía a "natacion"
12- Intente eliminar el socio que esté inscripto en algún deporte.
Mensaje de error, porque la restricción "FK_inscripciones_documento" fue especificada "set null", pero el campo clave foránea "documento" en "inscripciones" no admite valores nulos (forma parte de la clave primaria).
13- Elimine la restricción "FK_inscripciones_documento" y créela nuevamente especificando la acción "cascade" para borrado
14- Elimine un socio que esté inscripto en algún deporte
15- Verifique que el socio fue eliminado de "socios" y de "inscripciones"
16- Consulte el diccionario "user_constraints" especificando las tres tablas y analice la información
Nos retorna la siguiente información:
TABLE_NAME CONSTRAINT_NAME CONSTRAINT_TYPE DELETE_RULE ------------------------------------------------------------------------------------ DEPORTES SYS_C004914 P INSCRIPCIONES SYS_C004916 P INSCRIPCIONES FK_INSCRIPCIONES_CODIGODEPORTE R CASCADE INSCRIPCIONES FK_INSCRIPCIONES_DOCUMENTO R CASCADE SOCIOS SYS_C004915 P
17- Intente eliminar la tabla "deportes"
16- Elimine la restricción "foreign key" establecida sobre el campo "codigodeporte" de "inscripciones" y luego la tabla "deportes"
drop table inscripciones; drop table deportes; drop table socios; create table deportes( codigo number(2), nombre varchar2(20), primary key(codigo) ); create table socios( documento char(8), nombre varchar2(30), primary key(documento) ); create table inscripciones( documento char(8), codigodeporte number(2), matricula char(1),-- 's' si está paga, 'n' si no está paga primary key(documento,codigodeporte) ); alter table inscripciones add constraint FK_inscripciones_codigodeporte foreign key (codigodeporte) references deportes(codigo) on delete cascade; alter table inscripciones add constraint FK_inscripciones_documento foreign key (documento) references socios(documento) on delete set null; insert into deportes values(1,'basquet'); insert into deportes values(2,'futbol'); insert into deportes values(3,'natacion'); insert into deportes values(4,'tenis'); insert into socios values('30000111','Juan Lopez'); insert into socios values('31111222','Ana Garcia'); insert into socios values('32222333','Mario Molina'); insert into socios values('33333444','Julieta Herrero'); insert into inscripciones values ('30000111',1,'s'); insert into inscripciones values ('30000111',2,'s'); insert into inscripciones values ('31111222',1,'s'); insert into inscripciones values ('32222333',3,'n'); insert into inscripciones values('30000111',6,'s'); insert into inscripciones values('40111222',1,'s'); delete from deportes where nombre='tenis'; select s.nombre, s.documento, d.nombre as deporte from socios s join inscripciones i on s.documento=i.documento join deportes d on i.codigodeporte=d.codigo; delete from deportes where nombre='natacion'; select *from inscripciones; El registro de "inscripciones" con "documento" 32222333, ya no existe. delete from socios where documento='30000111'; alter table inscripciones drop constraint FK_INSCRIPCIONES_DOCUMENTO; alter table inscripciones add constraint FK_inscripciones_documento foreign key (documento) references socios(documento) on delete cascade; delete from socios where documento='30000111'; select *from socios where documento='30000111'; select *from inscripciones where documento='30000111'; select table_name,constraint_name, constraint_type, delete_rule from user_constraints where table_name='DEPORTES' OR table_name='SOCIOS' OR table_name='INSCRIPCIONES'; drop table deportes; alter table inscripciones drop constraint FK_INSCRIPCIONES_CODIGODEPORTE; drop table deportes;