39 - Clave primaria compuesta.


Problema:
 Una pequeña biblioteca de barrio registra los préstamos de sus libros en una tabla 
llamada "prestamos". En ella almacena la siguiente información:
 -título del libro,
 -documento de identidad del socio a quien se le presta el libro,
 -fecha de préstamo,
 -fecha de devolución del libro,
 -devuelto: si el libro ha sido o no devuelto.

1- Elimine la tabla "prestamos" si existe.

2- Necesitamos una clave que identifique cada registro en la tabla "prestamos". El mismo libro no 
puede prestarse en la misma fecha.

3- Cree la tabla:
 create table prestamos(
  titulo varchar(40) not null,
  documento char(8) not null,
  fechaprestamo date not null,
  fechadevolucion date,
  devuelto char(1) default 'N',
  primary key(titulo,fechaprestamo)
 );

4- Ingrese los siguientes registros para la tabla "prestamos":
 insert into prestamos (titulo,documento,fechaprestamo)
  values('Manual de 1 grado','22333444','2006-07-10');
 insert into prestamos (titulo,documento,fechaprestamo)
  values('Manual de 1 grado','22333444','2006-07-20');
 insert into prestamos (titulo,documento,fechaprestamo)
  values('Manual de 1 grado','23333444','2006-07-15');
 insert into prestamos (titulo,documento,fechaprestamo)
  values('El aleph','22333444','2006-07-10');
 insert into prestamos (titulo,documento,fechaprestamo)
  values('El aleph','30333444','2006-08-10');
Note que un mismo libro fue prestado a un mismo socio pero en una fecha distinta.

5- Intente ingresar un valor de clave primaria repetida:
 insert into prestamos (titulo,documento,fechaprestamo)
  values('Manual de 1 grado','25333444','2006-07-10');



 

Otros problemas:
A) Un consultorio médico en el cual trabajan 3 médicos registra las consultas de los pacientes en 
una tabla llamada "consultas".

1- Elimine la tabla si existe.

2- La tabla contiene los siguientes datos:
  - fechayhora: datetime not null, fecha y hora de la consulta,
  - medico: varchar(30), not null, nombre del médico (Perez,Lopez,Duarte),
  - documento: char(8) not null, documento del paciente,
  - paciente: varchar(30), nombre del paciente,
  - obrasocial: varchar(30), nombre de la obra social ('IPAM','PAMI').
 );

3- Un médico sólo puede atender a un paciente en una fecha y hora determianada. En una fecha y hora 
determinada, varios médicos atienden a distintos pacientes. Cree la tabla definiendo una clave 
primaria compuesta:
 create table consultas(
  fechayhora datetime not null,
  medico varchar(30) not null,
  documento char(8) not null,
  paciente varchar(30),
  obrasocial varchar(30),
  primary key(fechayhora,medico)
 );

4- Ingrese varias consultas para un mismo médico en distintas horas el mismo día.

5- Ingrese varias consultas para diferentes médicos en la misma fecha y hora.

6- Intente ingresar una consulta para un mismo médico en la misma hora el mismo día.


B) Un club dicta clases de distintos deportes. En una tabla llamada "inscriptos" almacena la 
información necesaria.

1- Elimine la tabla "inscriptos" si existe.

2- La tabla contiene los siguientes campos:
 - documento del socio alumno: char(8) not null
 - nombre del socio: varchar(30),
 - nombre del deporte (tenis, futbol, natación, basquet): varchar(15) not null,
 - año de inscripcion: year,
 - matrícula: si la matrícula ha sido o no pagada ('s' o 'n').

3- Necesitamos una clave primaria que identifique cada registro. Un socio puede inscribirse en 
varios deportes en distintos años. Un socio no puede inscribirse en el mismo deporte el mismo año. 
varios socios se inscriben en un mismo deporte. Cree la tabla con una clave compuesta:
 create table inscriptos(
  documento char(8) not null, 
  nombre varchar(30),
  deporte varchar(15) not null,
  año year,
  matricula char(1),
  primary key(documento,deporte,año)
 );

4- Inscriba a varios alumnos en el mismo deporte en el mismo año.

5- Inscriba a un mismo alumno en varios deportes en el mismo año.

6- Ingrese un registro con el mismo documento de socio en el mismo deporte en distintos años.

7- Intente inscribir a un socio alumno en un deporte en el cual ya esté inscripto en un año en el 
cual ya se haya inscripto.

8- Intente eliminar un campo parte de la clave.


C) Un comercio guarda la información de sus ventas en una tabla llamada "facturas".

1- Elimine la tabla si existe.

2- Intente crear la tabla con la siguiente estructura:
 create table facturas(
  serie char(1) not null,
  numero int(10) zerofill auto_increment,
  descripcion varchar(30),
  precioporunidad decimal(5,2) unsigned,
  cantidad tinyint unsigned,
  primary key (serie,numero) 
 );

3- Aparece un mensaje de error, la tabla no puede ser creada porque el campo definido 
como "auto_increment" es secundario (primero está "serie") y sabemos que un campo "auto_increment" 
debe estar primero en orden al ser definido parte de la clave compuesta.

4- Cree la tabla cambiando el orden de los campos estabecidos como clave primaria:
 create table facturas(
  serie char(1) not null,
  numero int(10) zerofill auto_increment,
  numeroitem smallint unsigned not null,
  descripcion varchar(30),
  precioporunidad decimal(5,2) unsigned,
  cantidad tinyint unsigned,
  primary key (numero,serie,numeroitem) 
 );
Tenga en cuenta al ingresar registros que el campo "numero" se autoincrementará sin tener en cuenta 
los demás campos.

5- Ingrese 3 registros con igual "serie", "numero" y distintos números de items:
 insert into facturas (serie,numero,numeroitem,descripcion,precioporunidad,cantidad)
  values('A',100,1,'escuadra 20 cm.',2.50,20);
 insert into facturas (serie,numero,numeroitem,descripcion,precioporunidad,cantidad)
  values('A',100,2,'escuadra 50 cm.',5,30);
 insert into facturas (serie,numero,numeroitem,descripcion,precioporunidad,cantidad)
  values('A',100,3,'goma lapiz-tinta',0.35,100);

6- Ingrese los siguientes registros:
 insert into facturas (serie,numero,numeroitem,descripcion,precioporunidad,cantidad)
  values('A',102,1,'lapices coloresx6',4.40,50);
 insert into facturas (serie,numero,numeroitem,descripcion,precioporunidad,cantidad)
  values('A',102,2,'lapices coloresx12',8,60);
 insert into facturas (serie,numero,numeroitem,descripcion,precioporunidad,cantidad)
  values('B',102,1,'lapices coloresx24',12.35,100);
 insert into facturas (serie,numero,numeroitem,descripcion,precioporunidad,cantidad)
  values('B',102,2,'goma lapiz-tinta',0.35,200);

7- Ingrese los siguientes registros y vea qué valor da al "numero" que no se ingresa:
 insert into facturas (serie,numeroitem,descripcion,precioporunidad,cantidad)
  values('A',1,'compas plastico',12,50);
 insert into facturas (serie,numeroitem,descripcion,precioporunidad,cantidad)
  values('A',1,'compas metal',18.90,80);

8- Intente ingresar un registro con valores de clave repetida:
insert into facturas (serie,numero,numeroitem,descripcion,precioporunidad,cantidad)
  values('A',104,1,'compas metal',18.90,80);

9- Muestre los registros concatenando "serie" con "numero", usando un alias para esa columna, 
muestre los demás campos y ordene por el alias:
 select concat_ws('-',serie,numero) as serienumero,
  numeroitem,descripcion,precioporunidad,cantidad
  from facturas
  order by serienumero;

10- Agrupe los registros por serie y número de factura y muestre el total (en una columna 
calculada) de cada factura:
 select serie,numero,
  sum(precioporunidad*cantidad) as total
  from facturas
  group by serie,numero;

Retornar