63 - Clave foránea.


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 la tabla "clientes" y "provincias", si existen:
 drop table if exists clientes, provincias;

2- Créelas con las siguientes estructuras:
 create table clientes (
  codigo int unsigned auto_increment,
  nombre varchar(30) not null,
  domicilio varchar(30),
  ciudad varchar(20),
  codigoprovincia tinyint unsigned,
  telefono varchar(11),
  primary key(codigo)
 );

 create table provincias(
  codigo tinyint unsigned auto_increment,
  nombre varchar(20),
  primary key (codigo)
 );

En este ejemplo, el campo "codigoprovincia" de "clientes" es una clave foránea, se emplea para 
enlazar la tabla "clientes" con "provincias".

3- Ingrese algunos registros para ambas tablas:
 insert into provincias(codigo,nombre) values(1,'Cordoba');
 insert into provincias(codigo,nombre) values(2,'Santa Fe');
 insert into provincias(codigo,nombre) values(30,'Misiones');
 insert into provincias(codigo,nombre) values(13,'Salta');
 insert into provincias(codigo,nombre) values(15,'Buenos Aires');
 insert into provincias(codigo,nombre) values(20,'Neuquen');

 insert into clientes (nombre,domicilio,ciudad,codigoProvincia,telefono)
  values ('Lopez Marcos', 'Colon 111', 'Córdoba',1,'null');
 insert into clientes (nombre,domicilio,ciudad,codigoProvincia,telefono)
  values ('Perez Ana', 'San Martin 222', 'Cruz del Eje',1,'4578585');
 insert into clientes (nombre,domicilio,ciudad,codigoProvincia,telefono)
  values ('Garcia Juan', 'Rivadavia 333', 'Villa Maria',1,'4578445');
 insert into clientes (nombre,domicilio,ciudad,codigoProvincia,telefono)
  values ('Perez Luis', 'Sarmiento 444', 'Rosario',2,null);
 insert into clientes (nombre,domicilio,ciudad,codigoProvincia,telefono)
  values ('Ramos Betina', 'San Martin 999', 'Bahia Blanca',15,'4223366');
 insert into clientes (nombre,domicilio,ciudad,codigoProvincia,telefono)
  values ('Lopez Lucas', 'San Martin 1010', 'Posadas',30,'0457858745');

4- Enlace las tablas:
 select c.nombre,c.ciudad,p.nombre
  from clientes as c
  left join provincias as p
  on c.codigoprovincia=p.codigo;

5- Modifique el campo "codigoprovincia" a "char(1)":
 alter table clientes
  modify codigoprovincia char(1);

6- Vea cómo afectó el cambio a la tabla "clientes":
 select * from clientes;
El cliente de "Bahia Blanca" con código de provincia "15" ("Buenos Aires") ahora tiene "1" 
("Cordoba") y el cliente con código de provincia "30" ("Misiones") ahora almacena "3" (valor 
inexistente en "provincias").

7- Realice un "left join" buscando coincidencia de códigos en la tabla "provincias":
 select c.nombre,c.ciudad,p.nombre
  from clientes as c
  left join provincias as p
  on c.codigoprovincia=p.codigo;
El resultado es erróneo.

8- Intente modificar la clave primaria en "provincias" para que se corresponda 
con "codigoprovincia" de "clientes":
 alter table provincias
  modify codigo char(1);
No lo permite porque si la modifica los valores para el campo clave quedan repetidos.



 

Otros problemas:
Un club dicta clases de distintos deportes. En una tabla llamada "deportes" guarda la información 
de los distintos deportes que se enseñan y en una tabla denominada "inscriptos" almacena la 
información necesaria para las inscripciones a los distintos deportes.

1- Elimine las tablas si existen.

2- Cree las tablas:
 create table deportes(
  codigo tinyint unsigned,
  nombre varchar(20),
  profesor varchar(30),
  primary key(codigo)
 );

 create table inscriptos(
  documento char(8) not null, 
  codigodeporte tinyint unsigned not null,
  año year,
  matriculapaga char(1),/* 's' si está paga, 'n' si no está paga*/
  primary key(documento,codigodeporte,año)
 );

3- Ingrese algunos registros para ambas tablas:
 insert into deportes values(1,'Tenis','Juan Lopez');
 insert into deportes values(2,'Natacion','Maria Lopez');
 insert into deportes values(3,'Basquet','Antonio Juarez');

 insert into inscriptos values ('22333444',2,'2005','s');
 insert into inscriptos values ('22333444',2,'2006','n');
 insert into inscriptos values ('23333444',2,'2005','s');
 insert into inscriptos values ('23333444',1,'2005','s');
 insert into inscriptos values ('23333444',1,'2006','s');
 insert into inscriptos values ('24333444',2,'2006','n');
 insert into inscriptos values ('24333444',3,'2006','n');

4- Muestre el nombre del deporte y todos los campos de la tabla "inscriptos":
 select d.nombre,i.*
  from deportes as d
  join inscriptos as i
  on d.codigo=i.codigodeporte;

5- Modifique el campo "codigo" de "deportes" para que almacene 1 caracter:
 alter table deportes modify codigo char(1);

6- Actualice la tabla "deportes" almacenando en "codigo" el primer caracter del nombre del deporte:
 update deportes set codigo=left(nombre,1);

7- Vea cómo cambió la tabla:
 select * from deportes;

8- Realice un "join":
 select d.nombre,i.*
  from deportes as d
  join inscriptos as i
  on d.codigo=i.codigodeporte;
No encuentra coincidencia.

Retornar