58 - Restricciones (foreign key)


Primer problema:

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ón

 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)
 );

 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;

 


Retornar