58 - Restricciones (foreign key) |
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" y créelas:
drop table clientes; drop table provincias; create table clientes ( codigo number(5), nombre varchar2(30), domicilio varchar2(30), ciudad varchar2(20), codigoprovincia number(2) ); create table provincias( codigo number(2), nombre varchar2(20) );
En este ejemplo, el campo "codigoprovincia" de "clientes" es una clave foránea, se emplea para enlazar la tabla "clientes" con "provincias".
2- Intente agregar una restricción "foreign key" a la tabla "clientes" que haga referencia al campo "codigo" de "provincias"
No se puede porque "provincias" no tiene restricción "primary key" ni "unique".
3- Establezca una restricción "unique" al campo "codigo" de "provincias"
4- 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); insert into clientes values(103,'Luisa Lopez','Juarez 555','La Plata',6);
5- Intente agregar la restricción "foreign key" del punto 2 a la tabla "clientes"
No se puede porque hay un registro en "clientes" cuyo valor de "codigoprovincia" no existe en "provincias".
6- Elimine el registro de "clientes" que no cumple con la restricción y establezca la restricción nuevamente.
7- Intente agregar un cliente con un código de provincia inexistente en "provincias"
8- Intente eliminar el registro con código 3, de "provincias".
No se puede porque hay registros en "clientes" al cual hace referencia.
9- Elimine el registro con código "4" de "provincias"
Se permite porque en "clientes" ningún registro hace referencia a él.
10- Intente modificar el registro con código 1, de "provincias"
No se puede porque hay registros en "clientes" al cual hace referencia.
11- Vea las restricciones de "clientes" consultando "user_constraints"
12- Vea las restricciones de "provincias"
13- Intente eliminar la tabla "provincias" (mensaje de error)
14- Elimine la restricción "foreign key" de "clientes" y luego 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) ); create table provincias( codigo number(2), nombre varchar2(20) ); alter table clientes add constraint FK_clientes_codigoprovincia foreign key (codigoprovincia) references provincias(codigo); alter table provincias add constraint UQ_provincias_codigo unique (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); insert into clientes values(103,'Luisa Lopez','Juarez 555','La Plata',6); alter table clientes add constraint FK_clientes_codigoprovincia foreign key (codigoprovincia) references provincias(codigo); delete from clientes where codigoprovincia=6; alter table clientes add constraint FK_clientes_codigoprovincia foreign key (codigoprovincia) references provincias(codigo); insert into clientes values(104,'Garcia Marcos','Colon 877','Lules',9); Oracle no lo permite. delete from provincias where codigo=3; delete from provincias where codigo=4; update provincias set codigo=7 where codigo=1; select constraint_name, constraint_type from user_constraints where table_name='CLIENTES'; select constraint_name, constraint_type from user_constraints where table_name='PROVINCIAS'; drop table provincias; alter table clientes drop constraint FK_CLIENTES_CODIGOPROVINCIA; drop table provincias;