36 - Restricción check


Primer problema:
Una empresa tiene registrados datos de sus empleados en una tabla llamada "empleados".
1- Créela con la siguiente estructura:
 create table empleados (
  documento varchar(8),
  nombre varchar(30),
  fechanacimiento date,
  cantidadhijos smallint,
  seccion varchar(20),
  sueldo decimal(6,2)
 );

2- Agregue una restricción "check" para asegurarse que no se ingresen valores negativos para el 
sueldo

3- Ingrese algunos registros válidos:
 insert into empleados values ('22222222','Alberto Lopez','1965/10/05',1,'Sistemas',1000);
 insert into empleados values ('33333333','Beatriz Garcia','1972/08/15',2,'Administracion',3000);
 insert into empleados values ('34444444','Carlos Caseres','1980/10/05',0,'Contaduría',6000);

4- Intente agregar otra restricción "check" al campo sueldo para asegurar que ninguno supere el 
valor 5000
La sentencia no se ejecuta porque hay un sueldo que no cumple la restricción.

5- Elimine el registro infractor y vuelva a crear la restricción

 alter table empleados
 add constraint CK_empleados_sueldo_maximo
 check (sueldo<=5000); 

6- Establezca una restricción para controlar que la fecha de nacimiento que se ingresa no supere la 
fecha actual

7- Establezca una restricción "check" para "cantidadhijos" que permita solamente valores entre 0 y 
15.

8- Vea todas las restricciones de la tabla (5 filas)

9- Intente agregar un registro que vaya contra alguna de las restricciones al campo "sueldo".
Mensaje de error porque se infringe la restricción "CK_empleados_sueldo_positivo".

10- Intente agregar un registro con fecha de nacimiento futura.
Mensaje de error.

11- Intente modificar un registro colocando en "cantidadhijos" el valor "21".
Mensaje de error.
Ver solución

 drop table if exists empleados;

 create table empleados (
  documento varchar(8),
  nombre varchar(30),
  fechanacimiento date,
  cantidadhijos smallint,
  seccion varchar(20),
  sueldo decimal(6,2)
 );

 alter table empleados
 add constraint CK_empelados_sueldo_positivo
 check (sueldo>0);

 insert into empleados values ('22222222','Alberto Lopez','1965/10/05',1,'Sistemas',1000);
 insert into empleados values ('33333333','Beatriz Garcia','1972/08/15',2,'Administracion',3000);
 insert into empleados values ('34444444','Carlos Caseres','1980/10/05',0,'Contaduría',6000);


 alter table empleados
 add constraint CK_empleados_sueldo_maximo
 check (sueldo<=5000);

 delete from empleados where sueldo=6000;

 alter table empleados
 add constraint CK_empleados_sueldo_maximo
 check (sueldo<=5000); 

 alter table empleados
 add constraint CK_fechanacimiento_actual
 check (fechanacimiento<current_date);

 alter table empleados
 add constraint CK_cantidadhijos_valores
 check (cantidadhijos between 0 and 15);

 select *
  from information_schema.table_constraints 
  where table_name = 'empleados';

 insert into empleados
  values ('24444444','Carlos Fuentes','1980/02/05',2,'Administracion',-1500);

 insert into empleados
  values ('25555555','Daniel Garcia','2007/05/05',2,'Sistemas',1550);

 update empleados set cantidadhijos=21 where documento='22222222';

 

Segundo problema:
Una playa de estacionamiento almacena los datos de los vehículos que ingresan en la tabla llamada 
"vehiculos".

1- Cree la tabla:
 create table vehiculos(
  numero serial,
  patente char(6),
  tipo char(4),
  fechahoraentrada timestamp,
  fechahorasalida timestamp,
  primary key(numero)
 );

2- Ingresamos algunos registros:
 insert into vehiculos (patente,tipo,fechahoraentrada,fechahorasalida)
   values('AIC124','auto','2007/01/17 8:05','2007/01/17 12:30');
 insert into vehiculos (patente,tipo,fechahoraentrada,fechahorasalida)
   values('CAA258','auto','2007/01/17 8:10',null);
 insert into vehiculos (patente,tipo,fechahoraentrada,fechahorasalida) 
   values('DSE367','moto','2007/01/17 8:30','2007/01/17 18:00');

3- Agregue una restricción "check" para asegurarse que la fecha de entrada a la playa no sea 
posterior a la fecha y hora actual

4- Agregue otra restricción "check" al campo "fechahoraentrada" que establezca que sus valores no 
sean posteriores a "fechahorasalida"

5- Intente ingresar un valor que no cumpla con la primera restricción establecida en el campo 
"fechahoraentrada"

6- Intente modificar un registro para que la salida sea anterior a la entrada
Mensaje de error.

7- Vea todas las restricciones para la tabla "vehiculos":
 select *
  from information_schema.table_constraints 
  where table_name = 'empleados';

8- Vea todos los registros

Ver solución
 drop table if exists vehiculos;

 create table vehiculos(
  numero serial,
  patente char(6),
  tipo char(4),
  fechahoraentrada timestamp,
  fechahorasalida timestamp,
  primary key(numero)
 );

 insert into vehiculos (patente,tipo,fechahoraentrada,fechahorasalida)
   values('AIC124','auto','2007/01/17 8:05','2007/01/17 12:30');
 insert into vehiculos (patente,tipo,fechahoraentrada,fechahorasalida)
   values('CAA258','auto','2007/01/17 8:10',null);
 insert into vehiculos (patente,tipo,fechahoraentrada,fechahorasalida) 
   values('DSE367','moto','2007/01/17 8:30','2007/01/17 18:00');


 alter table vehiculos
 add constraint CK_vehiculos_fechahoraentrada_actual
 check (fechahoraentrada<=current_date);

 alter table vehiculos
 add constraint CK_vehiculos_fechahoraentradasalida
 check (fechahoraentrada<=fechahorasalida);

 insert into vehiculos (patente,tipo,fechahoraentrada,fechahorasalida)
   values('ABC123','auto','2007/05/05 10:10',null);

 update vehiculos set fechahorasalida='2007/01/17 7:30'
  where patente='CAA258';

 select *
  from information_schema.table_constraints 
  where table_name = 'vehiculos';

 select * from vehiculos;

Retornar