39 - Clave primaria compuesta.


Problema:

Una playa de estacionamiento guarda cada día los datos de los vehículos que ingresan a la playa en una tabla llamada "vehiculos".

Eliminamos la tabla, si existe:

 drop table if exists vehiculos;

Para crear una tabla con clave primaria compuesta usamos la siguiente sintaxis:

 create table vehiculos(
  patente char(6) not null,
  tipo char(4),
  horallegada time not null,
  horasalida time,
  primary key(patente,horallegada)
 );

Veamos la estructura de la tabla:

 describe vehiculos;

Vemos que en la columna "key", en ambos campos aparece "PRI", porque ambos son clave primaria.

Ingresemos los siguientes registros:

 insert into vehiculos (patente,tipo,horallegada,horasalida)
  values('ACD123','auto','8:30','9:40');
 insert into vehiculos (patente,tipo,horallegada,horasalida)
  values('AKL098','auto','8:45','11:10');
 insert into vehiculos (patente,tipo,horallegada,horasalida)
  values('HGF123','auto','9:30','11:40');
 insert into vehiculos (patente,tipo,horallegada,horasalida)
  values('DRT123','auto','15:30',null);
 insert into vehiculos (patente,tipo,horallegada,horasalida)
  values('FRT545','moto','19:45',null);
 insert into vehiculos (patente,tipo,horallegada,horasalida)
  values('GTY154','auto','20:30','21:00');

4- Intente ingresar un vehículo con clave primaria repetida:

 insert into vehiculos (patente,tipo,horallegada,horasalida)
   values('ACD123','auto','16:00',null);

Aparece un mensaje de error indicando que la clave está duplicada.

5- Si ingresamos un registro con patente repetida, no hay problemas, siempre que la hora de ingreso sea diferente, sino, repetimos el valor de la clave:

 insert into vehiculos (patente,tipo,horallegada,horasalida)
  values('ACD123','auto','16:00',null);

6- Si ingresamos un registro con hora de ingreso repetida, no hay problemas, siempre que la patente sea diferente, sino, repetimos el valor de la clave:

 insert into vehiculos (patente,tipo,horallegada,horasalida)
  values('ADF123','moto','8:30','10:00');

7- Intente eliminar el campo "horallegada":

 alter table vehiculos drop horallegada;

No se puede porque quedarían registros con clave repetida.

8- Elimine los registros con patente "ACD123":

 delete from vehiculos
  where patente='ACD123';

9- Intente nuevamente eliminar el campo "horallegada":

 alter table vehiculos drop horallegada;

Ahora si lo permite.

10- Vea la estructura de la tabla para ver cómo quedó la clave primaria:

  describe vehiculos;



Retornar