54 - Restricciones foreign key en la misma tabla


Primer problema:
Una empresa registra los datos de sus clientes en una tabla llamada "clientes". Dicha tabla contiene un campo 
que hace referencia al cliente que lo recomendó denominado "referenciadopor". Si un cliente 
no ha sido referenciado por ningún otro cliente, tal campo almacena "null".
1- Creemos la tabla:
 create table clientes(
  codigo int,
  nombre varchar(30),
  domicilio varchar(30),
  ciudad varchar(20),
  referenciadopor int,
  primary key(codigo)
 );

2- Ingresamos algunos registros:
 insert into clientes values (50,'Juan Perez','Sucre 123','Cordoba',null);
 insert into clientes values(90,'Marta Juarez','Colon 345','Carlos Paz',null);
 insert into clientes values(110,'Fabian Torres','San Martin 987','Cordoba',50);
 insert into clientes values(125,'Susana Garcia','Colon 122','Carlos Paz',90);
 insert into clientes values(140,'Ana Herrero','Colon 890','Carlos Paz',9);

3- Intente agregar una restricción "foreign key" para evitar que en el campo "referenciadopor" se 
ingrese un valor de código de cliente que no exista.
No se permite porque existe un registro que no cumple con la restricción que se intenta establecer.

4- Cambie el valor inválido de "referenciadopor" del registro que viola la restricción por uno 
válido.

5- Agregue la restricción "foreign key" que intentó agregar en el punto 3.

6- Intente agregar un registro que infrinja la restricción.
No lo permite.

7- Intente modificar el código de un cliente que está referenciado en "referenciadopor".
No se puede.

8- Intente eliminar un cliente que sea referenciado por otro en "referenciadopor".
No se puede.

9- Cambie el valor de código de un cliente que no referenció a nadie.

10- Elimine un cliente que no haya referenciado a otros.
Ver solución

 drop table if exists clientes;

 create table clientes(
  codigo int,
  nombre varchar(30),
  domicilio varchar(30),
  ciudad varchar(20),
  referenciadopor int,
  primary key(codigo)
 );

 insert into clientes values (50,'Juan Perez','Sucre 123','Cordoba',null);
 insert into clientes values(90,'Marta Juarez','Colon 345','Carlos Paz',null);
 insert into clientes values(110,'Fabian Torres','San Martin 987','Cordoba',50);
 insert into clientes values(125,'Susana Garcia','Colon 122','Carlos Paz',90);
 insert into clientes values(140,'Ana Herrero','Colon 890','Carlos Paz',9);


  alter table clientes
  add constraint FK_clientes_referenciadopor
  foreign key (referenciadopor)
  references clientes (codigo);

 update clientes set referenciadopor=90 where referenciadopor=9;

 alter table clientes
  add constraint FK_clientes_referenciadopor
  foreign key (referenciadopor)
  references clientes (codigo);

 insert into clientes values(150,'Karina Gomez','Caseros 444','Cruz del Eje',8);

 update clientes set codigo=180 where codigo=90;

 delete from clientes where nombre='Marta Juarez';

 update clientes set codigo=180 where codigo=125;

 delete from clientes where codigo=110;

 


Retornar